【问题标题】:Django Inlines and DateTimeFieldDjango 内联和 DateTimeField
【发布时间】:2013-01-14 07:10:44
【问题描述】:

我正在尝试创建简单的事件应用程序,所以我决定创建事件和一些内联事件发生:

class EventOccurenceInline(admin.TabularInline):
    model = models.EventOccurance
    form = forms.EventOccuranceForm
    pass


class EventAdmin(TranslatableAdmin):
    list_display = [ "internal_name"]
    inlines = [
        EventOccurenceInline,
    ]
    pass

这是forms.py:

class EventOccurenceForm(TranslatableModelForm):
    start_date = forms.DateTimeField()
    end_date = forms.DateTimeField()
    class Meta:
        model = models.EventOccurence

但是,当我打开后端时,我只看到简单的输入而不是日期时间选择器,甚至这些字段的标签也没有说明:

有谁知道如何在内联中使用这些小部件?我做错了什么?

提前致谢, 迈克尔

【问题讨论】:

  • 行内不指定表格是否有效?
  • @Rohan,不,现在什么都没有显示。
  • 我听说有人在使用广告拦截器和 DateTime 小部件时遇到问题
  • @PT114,没有安装广告拦截器 :(
  • TranslatableAdminTranslatableModelForm从何而来?

标签: django events backend inline-formset


【解决方案1】:

问题似乎在于您在 EventOccurenceForm 类中声明了 start_dateend_date 字段而没有任何参数。

这里引用了 Django 在 Overriding the default field types or widgets 部分中的“从模型创建表单”文档:

如果你像这样显式地实例化一个表单域,Django 假设 你想完全定义它的行为;因此,默认 属性(例如max_lengthrequired)不是从 对应型号。如果要保持中指定的行为 模型时,您必须明确设置相关参数 声明表单域。

你为什么要在EventOccurenceForm 类中声明start_dateend_date 字段?是因为您试图在表单中只包含这两个字段吗?如果是这种情况,您应该改用内部 Meta 类的 fields 属性。

我假设 EventOccurence 模型的 start_dateend_date 字段是 DateFields,因此,在 Django 管理员中,默认情况下它们将具有 AdminDateWidget 小部件。如果由于某种原因不是这种情况并且您无法更改模型,则始终可以使用EventOccurenceForm 类的内部Meta 类的widgets 属性,如下所示:

from django.contrib.admin.widgets import AdminDateWidget

class EventOccurenceForm(TranslatableModelForm):
    class Meta:
        model = models.EventOccurence
        widgets = {
            'start_date': AdminDateWidget,
            'end_date': AdminDateWidget,
        }

【讨论】:

  • 亚当,非常感谢您的帮助。这似乎是一种不同类型的错误,但您的回答显示了正确的方向。问题出在我的模型声明中。它有“auto_add_now”参数,阻止整个字段显示在表单内。一旦我删除了该参数并使用了您的小部件声明,一切都开始像魅力一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2020-05-27
  • 1970-01-01
  • 2015-02-04
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多