我如何指定Django形式的字段顺序?

问题描述 投票:0回答:3

我们正在使用Django 2.2,我想升级到Django 3.0。我们有一个mixin(编写于2017年),可以向表单添加字段:

class LocalizedFirstLastNameMixin(object):
    def __init__(self, *args, **kwargs):
        self.language_code = kwargs.pop('language_code', 'en')
        super().__init__(*args, **kwargs)
        for loc_field in reversed(self.get_localized_fields()):
            self.fields[loc_field] = User._meta.get_field(loc_field).formfield()
            self.fields[loc_field].required = True
            self.fields.move_to_end(loc_field, last=False)
            self.initial[loc_field] = getattr(self.instance, loc_field, '')

[self.get_localized_fields()以英语或以相同的本地化语言返回我们正在使用的当前语言。(按此顺序)。

此mixin用作继承自('first_name_en', 'last_name_en')的表单的基类之一:

ModelForm

它适用于Django 2.2以下的版本。但是,当我升级到3.0时,会收到此错误消息:

class RegistrationForm(AddAttributesToFieldsMixin, CleanEmailMixin, CleanNewPasswordMixin, CleanDateOfBirthMixin, LocalizedFirstLastNameMixin, forms.ModelForm): .... class ProfileForm(AddAttributesToFieldsMixin, CleanDateOfBirthMixin, LocalizedFirstLastNameMixin, forms.ModelForm): ....

此功能的信息:

AttributeError: 'dict' object has no attribute 'move_to_end'

它属于Move an existing element to the end (or beginning if last==False).

所以我想我们希望这些字段位于表单字段的开头。

在Django 3.0中表单中字段的实现是否发生了变化,我如何指定字段的顺序?如果我进行更改,它将在Django 2.2等以前的版本中运行吗?

我检查了OrderedDict,并且从3.0.1发行到3.0.5,但没有找到有关此问题的任何文档。

更新:

我发现可以调用Django 3.0 release notes,但是如何定义来自模型的字段?我只想在字段列表的开头添加两个其他字段。

我们正在使用Django 2.2,我想升级到Django 3.0。我们有一个mixin(写于2017年),它向表单添加字段:Class LocalizedFirstLastNameMixin(object):def __init __(self,* args,** ...

python django django-forms modelform django-3.0
3个回答
1
投票

表单中字段的实现是否发生变化


1
投票

我在from collections import OrderedDict class LocalizedFirstLastNameMixin(object): def __init__(self, *args, **kwargs): self.language_code = kwargs.pop('language_code', 'en') super().__init__(*args, **kwargs) self.fields = OrderedDict(self.fields) for loc_field in reversed(self.get_localized_fields()): self.fields[loc_field] = User._meta.get_field(loc_field).formfield() self.fields[loc_field].required = True self.fields.move_to_end(loc_field, last=False) self.initial[loc_field] = getattr(self.instance, loc_field, '') 中询问,并被告知不要自己操作字段的顺序,而要使用Django developers mailing list中记录的受支持的API方法。因此,我更改了代码并改用here


0
投票

[class LocalizedFirstLastNameMixin(object): def __init__(self, *args, **kwargs): self.language_code = kwargs.pop('language_code', 'en') super().__init__(*args, **kwargs) localized_fields = self.get_localized_fields() for loc_field in localized_fields: self.fields[loc_field] = User._meta.get_field(loc_field).formfield() self.fields[loc_field].required = True self.initial[loc_field] = getattr(self.instance, loc_field, '') self.order_fields(field_order=localized_fields) 来自标准库。

© www.soinside.com 2019 - 2024. All rights reserved.