Ich habe gerade entdeckt, dass Django nicht automatisch zusätzliche Leerzeichen aus Eingaben in das Formularfeld entfernt, und ich denke, ich verstehe die Begründung ("Frameworks sollten die Benutzereingabe nicht verändern").
Ich denke, ich weiß, wie man den überschüssigen Whitespace mit pythons re:
entfernt %Vor%Die Frage ist, wo soll ich das machen? Vermutlich sollte das in einer der sauberen Phasen der Form passieren, aber welche? Im Idealfall möchte ich alle meine Felder von zusätzlichen Leerzeichen reinigen. Wenn es in der clean_field () Methode gemacht werden sollte, würde das bedeuten, dass ich eine Menge clean_field () Methoden haben müsste, die im Grunde dasselbe tun, was wie eine Menge Wiederholungen aussieht.
Wenn nicht die Reinigungsstufen des Formulars, dann vielleicht in dem Modell, auf dem das Formular basiert?
Danke für Ihre Hilfe!
W
Mein Ansatz ist hier entlehnt. Aber anstatt django.forms.Form zu unterklassifizieren, verwende ich ein Mixin. Auf diese Weise kann ich es sowohl mit Form
als auch mit ModelForm
verwenden. Die hier definierte Methode überschreibt BaseForm
_clean_fields
method.
Um es zu verwenden, füge einfach das Mixin zu deinem Formular hinzu
%Vor%Wenn Sie beim Speichern von Modellen, die kein Formular haben, den Leerraum zuschneiden möchten, können Sie auch den folgenden Mix verwenden. Modelle ohne Formulare werden standardmäßig nicht überprüft. Ich benutze dies, wenn ich Objekte auf Basis von JSON-Daten erzeuge, die von externem Rest-API-Aufruf zurückgegeben werden.
%Vor%Dann in deinem models.py
%Vor% Wie wäre es mit dem def clean(self):
im Formular?
Weitere Informationen finden Sie unter: Ссылка
Ihre Methode könnte etwa so aussehen:
%Vor%Verwenden Sie den folgenden Mix:
%Vor%Fügen Sie dies zu Ihrem Formular hinzu, z. B .:
%Vor% Dies ist der Antwort von pymarco ähnlich, beinhaltet jedoch nicht das Kopieren und Einfügen von Django-Code (der Inhalt der Methode _clean_fields
).
Stattdessen überschreibt es full_clean
, ruft aber nach einigen Anpassungen der Eingabedaten die ursprüngliche full_clean
-Methode auf. Dies macht es weniger abhängig von Implementierungsdetails von Djangos Form
-Klasse, die sich ändern könnten (und sich tatsächlich seit dieser Antwort geändert haben).
In diesem Fall könnte es nützlich sein, ein eigenes Formularfeld zu erstellen (es ist nicht so schwer wie es klingt). In der Methode clean()
würden Sie diese zusätzlichen Leerzeichen entfernen.
Zitieren der Dokumentation:
Sie können problemlos benutzerdefinierte Feldklassen erstellen. Um dies zu tun, erstellen Sie einfach ein Unterklasse von django.forms.Field. Seine einzigen Anforderungen sind, dass es Implementieren Sie eine clean () -Methode, und akzeptieren Sie die Methode __init __ () Kernargumente (erforderlich, Label, Initial, Widget, help_text).
Mehr dazu: Ссылка
Eine Möglichkeit besteht darin, ein benutzerdefiniertes Formularwidget anzugeben, das Leerzeichen löscht:
%Vor%Dann verwenden Sie dies in Ihrer ModelForm:
%Vor% Der beste Ort hierfür ist jedoch Ihrer Ansicht nach , nachdem das Formular validiert wurde; bevor Sie irgendwelche Einfügungen in die DB oder andere Manipulation von Daten machen, wenn Sie ModelForm
s verwenden.
Sie können immer Ihre eigenen nicht ModelForm
-Formulare erstellen und jeden Aspekt des Feldes und die Validierung auf diese Weise steuern.
ModelForm
fügt Prüfungen für Werte hinzu, die gegen die db-Einschränkungen verstoßen würden. Wenn also das Feld ' hello '
als gültige Eingabe akzeptieren kann, hätte ModelForms is_valid()
keinen Grund, die Whitespaces zu streichen (da dies nicht zu einer willkürlichen sauberen Logik führen würde, zusätzlich zu dem, was Sie erwähnten, sollten Frameworks sich nicht ändern Benutzereingabe ").
Wenn Sie jedes CharField in Ihrem Projekt entfernen möchten (); Am einfachsten ist monkeypatch die standardmäßige Reinigungsmethode von CharField.
innerhalb von: monkey_patch/__init__.py