【问题标题】:How can I order fields in Django ModelForm?如何在 Django ModelForm 中订购字段?
【发布时间】:2011-02-23 00:31:50
【问题描述】:

我有一个“订单”模型:

class Order(models.Model):
     date_time=models.DateTimeField()
     # other stuff

我正在使用 Django ModelForm 类来呈现表单,但我想分别显示日期和时间小部件。我想出了这个:

class Form(forms.ModelForm): 
    class Meta:
        model = Order
        exclude = ('date_time',)
        date = forms.DateField()
        time = forms.TimeField()

问题是我想把这些字段放在“其他东西”之间

【问题讨论】:

标签: python sorting django-forms


【解决方案1】:

你可以使用:

class Meta:
    fields = [ ..., 'date', 'time', ... ]

查看文档:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the-order-of-fields

【讨论】:

  • 这是正确答案,而我只想提一下 fields=[...] 可以包含用户定义的字段。
  • 没错,当您尝试覆盖 __init__ 时,改为调用 self.fields.keyOrder = [ <model and user defined fields > ...] - 您会遇到问题(异常等)。
  • 截至 2021 年 1 月/Django 3.0,您链接到的文档不包含“更改字段顺序”部分。如果我使用您提供的解决方案,Django 会抛出“ModelForm has no model class specified”错误。
  • 对于 Django 3.1,当然对于以前的版本,只读字段总是放在最后。
【解决方案2】:

添加到 Lukasz 的答案中,在 Django 2.0 中,带有字段排序的完整管理表单注册如下所示:

models.py

class Order(models.Model):
    date_time = models.DateTimeField()
    # other fields

admin.py

class OrderForm(forms.ModelForm):
    datef = forms.DateField()
    timef = forms.TimeField()

    class Meta:
      model = Order
      exclude = ['date_time']
      fields = (
          'datef',
          'timef',
          # other fields
      )

class OrderAdmin(admin.ModelAdmin):
    form = OrderForm

admin.site.register(Order, OrderAdmin)

请注意,日期和时间字段是在 ModelForm 类中定义的,而不是在 Meta 类中。

【讨论】:

  • 这需要指定所有字段...有没有办法像 field_order 对常规表单的工作方式一样?其余字段附加到末尾。
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2021-10-10
  • 2019-02-17
  • 2019-04-04
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多