<blockquote>
<p>Is there a change in the implementation of the fields in forms</p>
</blockquote>
<p>Django 2.2和3之间的变化是声明字段的初始化方式:</p>
<ul>
<li>Django 2.2.12 <a href="https://github.com/django/django/blob/2.2.12/django/forms/forms.py#L39" rel="nofollow noreferrer">https://github.com/django/django/blob/2.2.12/django/forms/forms.py#L39</a></li>
<li>Django 3<a href="https://github.com/django/django/blob/master/django/forms/forms.py#L36" rel="nofollow noreferrer">https://github.com/django/django/blob/master/django/forms/forms.py#L36</a></李>
</ul>
<p>我想这是因为Django3支持版本3.6或更高版本(<a href="https://docs.djangoproject.com/en/3.0/faq/install/" rel="nofollow noreferrer">https://docs.djangoproject.com/en/3.0/faq/install/</a>)的Python,并且Python3.6 dict是按插入顺序(<a href="https://stackoverflow.com/questions/39980323/are-dictionaries-ordered-in-python-3-6">Are dictionaries ordered in Python 3.6+?</a>)的</p>
<hr/>
<p>我会将<code>self.fields</code>转换为<code>OrderedDict</code>(基本上回到2.2版中的情况),以再次启用<code>self.fields.move_to_end</code></p>
<pre><code>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, '')
</code></pre>