【问题标题】:ModelForm fields order inaffected? [duplicate]ModelForm 字段顺序不受影响? [复制]
【发布时间】:2013-12-15 16:34:39
【问题描述】:

试图更改管理员ModelForm 中的字段顺序。 贝娄是我的尝试,但顺序保持不变。添加的字段oi_numbervat_number 在末尾呈现,除了它们在self.fields SortedDict 字典中的末尾not

class ContactAdminForm(forms.ModelForm):
    oi_number = fields_for_model(OrganizationExtra)['oi_number']
    vat_number = fields_for_model(OrganizationExtra)['vat_number']
    # fields = ('organization', 'oi_number', 'vat_number')
    # ^^^ this won't affect fields order either

    class Meta:
        model = Organization

    def __init__(self, *args, **kwargs):
        super(ContactAdminForm, self).__init__(*args, **kwargs)
        try:
            org_ix = self.fields.keyOrder.index('organization')
            self.fields.keyOrder.insert(org_ix+1, self.fields.keyOrder[-2])
            self.fields.keyOrder.insert(org_ix+2, self.fields.keyOrder[-1])
            del self.fields.keyOrder[-2:]
        except ValueError:
            pass

在调用__init__ 方法之前得到解析的字段顺序吗?如何更改他们的订单?

更新: 上面的ModelForm 被用作管理模型中的一个表单,它定义了自己的字段,所以如果我把所有字段定义都放在上面的表单中,我会得到FieldError 关于未知字段名的异常:

class ContactAdminForm(forms.ModelForm):
    ...
    class Meta:
        model = Organization
        fields = ('organization', 'oi_number', 'vat_number')

class ContactOptionsEx(ContactOptions):
    form = ContactAdminForm

admin.site.register(Contact, ContactOptionsEx)

# at attempt to render the form:
# FieldError at /admin/contact/contact/3/
# Unknown field(s) (organization) specified for Organization

但是名为organization 的字段确实存在,并且在ContactAdminForm.__init__ 方法中可用。

【问题讨论】:

  • 你把fields = ...放在Meta下面了吗?这应该工作......
  • @sk1p 如果我确实将字段放在Meta 类中,那么我会收到FieldError 异常。有关详细信息,请参阅问题更新。
  • @yuvi 我相信链接的可能重复项不能完全回答问题。
  • 看到您的更新,这对您有帮助吗? stackoverflow.com/questions/350799/…
  • @yuvi 不幸的是没有。表单的__init__ 方法中的任何顺序更改均无效。仅在Meta 类中设置。

标签: python django django-forms satchmo


【解决方案1】:

错误

为组织指定的未知字段(组织)

不引用表单上的字段,而是引用模型上的字段 (Organization)。

我认为这里的问题是您试图将来自不同模型 (OrganizationExtra) 的字段添加到 ModelFormOrganizationModelFormModel 之间始终存在一对一的关系。如果要在后台编辑相关实例,可以使用内联:

class OrganizationExtraInline(admin.StackedInline):
    model = OrganizationExtra

class ContactOptionsEx(ContactOptions):
    inlines = ContactOptions.inlines + [OrganizationExtraInline]
    # ...

如果要将内联限制为一个实例,请使用 OneToOneFieldmax_num = 1

【讨论】:

  • 你说得对,我正在尝试添加来自不同模型的字段。我知道我可以使用StackedInlineTabularInline 类来显示相关模型的字段,但是我想直接在organization 字段下面插入这些额外的字段,即。在默认模型的字段之间。
  • 我想一个选项是在 python 端使用内联,但覆盖 changeform 模板以重新排序字段……现在想不出别的了。
  • @DavidUnric 所以如果它是如此定制,你可能想放弃 django.forms 并自己解决。我个人认为 django.forms 是 django 框架中最薄弱的部分,缺陷很多。我发现自己不止一次构建自己的(或使用替代品),即使定制看起来很简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多