Python 模型表单字段顺序不受影响?

Python 模型表单字段顺序不受影响?,python,django,django-forms,satchmo,Python,Django,Django Forms,Satchmo,正在尝试更改管理模型表单中字段的顺序。 下面是我的尝试,但秩序保持不变。添加的字段oi_number和vat_number在self.fields SortedDict dictionary中不在末尾,并且在末尾呈现 class ContactAdminForm(forms.ModelForm): oi_number = fields_for_model(OrganizationExtra)['oi_number'] vat_number = fields_for_model(O

正在尝试更改管理模型表单中字段的顺序。 下面是我的尝试,但秩序保持不变。添加的字段oi_number和vat_number在self.fields SortedDict dictionary中不在末尾,并且在末尾呈现

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中可用。\uuuu init\uuuu方法。

错误

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

不是指表单上的字段,而是指模型组织上的字段

我认为这里的问题是,您试图将来自不同模型组织的字段额外添加到组织的模型表单中。模型表单和模型之间始终存在一对一的关系。如果要在管理中编辑相关实例,可以使用内联线:

class OrganizationExtraInline(admin.StackedInline):
    model = OrganizationExtra

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

如果要将内联限制为一个实例,请使用OneToOneField或max_num=1。。。在Meta下?这应该行得通…@sk1p如果我把字段放在Meta类中,那么我会得到FieldError异常。有关详细信息,请参阅问题更新。@yuvi我相信链接的可能重复项不能完全回答问题。查看您的更新,这对您有帮助吗@不幸的是,yuvi没有。在表单的_init______________)方法中,顺序上的任何更改都没有影响。仅在Meta类中设置。您是对的,我正在尝试添加来自不同模型的字段。我知道我可以使用StackedLine或TablerLine类来显示相关模型的字段,但是我想在organization field下面直接插入这些额外字段,例如,在默认模型的字段之间。我想一个选项是在python端使用内联,但覆盖changeform模板以重新排序字段…现在想不出任何其他内容。@DavidUnric因此,如果它是如此自定义的,您可能希望删除django.forms并自己解决它。我个人认为django.forms是django框架中最薄弱的部分,并且有很多缺陷。我发现自己不止一次地构建自己的或使用替代方案,即使定制看起来很简单