Wir verwenden Django 2.2 und ich möchte auf Django 3.0 aktualisieren. Wir haben ein Mixin (geschrieben im Jahr 2017), das Felder zu Formularen hinzufügt:
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()
gibt ('first_name_en', 'last_name_en')
(in dieser Reihenfolge) in Englisch oder in der gleichen lokalisierten Sprache in der aktuellen Sprache zurück, die wir verwenden.
Dieses Mixin wird als eine der Basisklassen für Formulare verwendet, die erben von ModelForm
:
class RegistrationForm(AddAttributesToFieldsMixin, CleanEmailMixin, CleanNewPasswordMixin, CleanDateOfBirthMixin, LocalizedFirstLastNameMixin, forms.ModelForm):
....
class ProfileForm(AddAttributesToFieldsMixin, CleanDateOfBirthMixin, LocalizedFirstLastNameMixin, forms.ModelForm):
....
Es funktioniert mit Django-Versionen bis 2.2. Aber wenn ich auf 3.0 upgrade, erhalte ich diese Fehlermeldung:
AttributeError: 'dict' object has no attribute 'move_to_end'
Informationen zu dieser Funktion:
Move an existing element to the end (or beginning if last==False).
Und es gehört dazu OrderedDict
.
Ich denke, wir möchten, dass sich diese Felder am Anfang der Formularfelder befinden.
Gibt es eine Änderung bei der Implementierung der Felder in Formularen in Django 3.0 und wie lege ich die Reihenfolge der Felder fest? Und wenn ich es ändere, funktioniert es in früheren Versionen wie Django 2.2?
Ich habe die Versionshinweise von Django 3.0 und auch Versionen von 3.0.1 bis 3.0.5 überprüft und keine Dokumentation zu diesem Problem gefunden.
Update: Ich habe herausgefunden, dass ich anrufen kann self.order_fields(...)
, aber wie definiere ich die Felder, die aus den Modellen stammen? Ich möchte nur zwei zusätzliche Felder am Anfang der Feldliste hinzufügen.
Ich habe in der Mailingliste der Django-Entwickler nachgefragt und mir wurde gesagt, die Reihenfolge der Felder nicht selbst zu ändern, sondern stattdessen die hier dokumentierten unterstützten API-Methoden zu verwenden . Also habe ich den Code geändert und self.order_fields
stattdessen verwendet:
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)
Beachten Sie, dass ich nur die ersten beiden Felder bestelle. Alle anderen Felder werden in der Standardreihenfolge beibehalten. Ich muss die Felder jetzt auch nicht in umgekehrter Reihenfolge hinzufügen.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen