Ändern Sie die Daten, die zum Django-Formular eingehen, bevor Sie reinigen

Ich brauche, um die Daten zu ändern, die vor der Reinigung eingegeben wurden. Ich habe es funktioniert, aber es sieht schrecklich aus:

  def __init__(self, *args, **kwargs): if len(args) > 0: data = args[0] elif 'data' in kwargs: data = kwargs['data'] else: data = None if data is not None: data['content'] = ' '.join(data['content'].strip().split()) super(TagForm, self).__init__(*args, **kwargs) 

Gibt es eine lakonische Lösung?

4 Solutions collect form web for “Ändern Sie die Daten, die zum Django-Formular eingehen, bevor Sie reinigen”

Sie können das if / elif / else auf eine Zeile leicht genug komprimieren:

 def __init__(self, *args, **kwargs): data = args[0] if args else kwargs.get('data', None) if data: data['content'] = ' '.join(data['content'].strip().split()) super(TagForm, self).__init__(*args, **kwargs) 

if args funktioniert so gut wie if len(args) > 0 weil length == 0 Items sind False und length > 0 Items sind True .

if data funktionieren, und if data is not None weil Sie davon ausgehen, dass die data mindestens einen Schlüssel haben, wenn es sowieso not None ist, und wenn es einen Schlüssel hat, ist es True .

Machen Sie data das erste Argument der __init__ Methode, das gleiche wie die Super-Klasse Form . So musst du nicht in args oder kwargs graben

 def __init__(self, data=None, *args, **kwargs): if data is not None: data = data.copy() # make it mutable data['content'] = ' '.join(data['content'].strip().split()) super(TagForm, self).__init__(data=data, *args, **kwargs) 

Ich fand eine andere Lösung:

 def clean(self, *args, **kwargs): data = dict(self.data) if 'content' in data: content = data['content'] if isinstance(content, list): content = content[0] # QueryDict wraps even single values to list data['content'] = ' '.join(content.strip().split()) self.data = data # I do this trick becouse request.POST is immutable return super(MyForm, self).clean(*args, **kwargs) 

UPD: Fehler beheben: super(self.__class__, self) kann unendliche Rekursion verursachen, wenn ich Formularvererbung verwende :).

UPD: scheint immer noch Schwierigkeiten und funktioniert nicht richtig.

Wie in der Dokumentation für Formular und __init__ können Sie es nicht auf Formularebene machen, also die __init__ Methode scheint der __init__ Weg zu sein. Sie können natürlich auch die Daten ändern, bevor Sie sie an das Formular übergeben (zB in Ihrer Ansicht oder wo Sie das Formular bearbeiten).

  • Heroku: Hintergrundaufgaben in Python mit RQ
  • Mehrere ModelAdmins / Ansichten für das gleiche Modell in Django admin
  • Django: wie man auf einem verwandten Feld eines verwandten Feldes bestellen kann
  • Auf GAE, wie kann ich ein Datum nach dem richtigen Client TimeZone zeigen?
  • Mongoengine: ConnectionError: Sie haben keine Standardverbindung definiert
  • Manage.py syncdb fügt keine Tabellen für einige Modelle hinzu
  • Kann nicht nach DRF schreiben modelviewset - request.data sofort geleert
  • Django-Rest-Framework-Serializer-Objekt vor dem Speichern bearbeiten
  • Wie mache ich viele Django-Abfrage, um Buch mit 2 Autoren zu finden?
  • Zugriff auf Wörterbuch mit Schlüssel in Django Vorlage
  • Django + Auth0 JWT-Authentifizierung verweigert zu dekodieren
  • Python ist die beste Programmiersprache der Welt.