django - Wo werden zusätzliche Leerzeichen aus Formularfeldeingaben entfernt?

7

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

    
Westerley 30.11.2011, 03:22
quelle

7 Antworten

10

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.

%Vor%

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%     
pymarco 21.01.2014 17:57
quelle
8

Erstellen Sie ein benutzerdefiniertes Modellfeld, damit das benutzerdefinierte Formularfeld automatisch verwendet wird.

%Vor%

Ersetzen Sie dann in Ihren Modellen django.db.models.CharField durch TrimmedCharField

    
philfreo 03.05.2012 16:57
quelle
6

Wie wäre es mit dem def clean(self): im Formular?

Weitere Informationen finden Sie unter: Ссылка

Ihre Methode könnte etwa so aussehen:

%Vor%     
Arthur Neves 30.11.2011 03:24
quelle
4

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).

    
spookylukey 06.07.2015 14:26
quelle
0

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: Ссылка

    
juliomalegria 30.11.2011 03:34
quelle
0

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.

Die Validierung von

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 ").

    
Burhan Khalid 30.11.2011 09:47
quelle
0

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

%Vor%     
Aaron 06.06.2016 21:10
quelle

Tags und Links