我们正在使用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,** ...
表单中字段的实现是否发生变化
我在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:
[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)
来自标准库。