【发布时间】:2020-07-23 05:05:44
【问题描述】:
我们正在使用 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() 以英语返回 ('first_name_en', 'last_name_en')(按此顺序),或者本地化为我们当前使用的语言。
这个mixin被用作继承自ModelForm的表单的基类之一:
class RegistrationForm(AddAttributesToFieldsMixin, CleanEmailMixin, CleanNewPasswordMixin, CleanDateOfBirthMixin, LocalizedFirstLastNameMixin, forms.ModelForm):
....
class ProfileForm(AddAttributesToFieldsMixin, CleanDateOfBirthMixin, LocalizedFirstLastNameMixin, forms.ModelForm):
....
它适用于最高 2.2 的 Django 版本。但是当我升级到 3.0 时,我收到以下错误消息:
AttributeError: 'dict' object has no attribute 'move_to_end'
这个函数的信息:
Move an existing element to the end (or beginning if last==False).
它属于OrderedDict。
所以我想我们希望这些字段位于表单字段的开头。
Django 3.0 中表单中字段的实现是否有变化,如何指定字段的顺序?如果我更改它,它是否可以在以前的版本(例如 Django 2.2)中运行?
我检查了Django 3.0 release notes 以及从 3.0.1 到 3.0.5 的版本,但我没有找到任何有关此问题的文档。
更新:我发现我可以调用self.order_fields(...),但是如何定义来自模型的字段?我只想在字段列表的开头添加两个额外的字段。
【问题讨论】:
标签: python django django-forms modelform django-3.0