Überschreiben Django-Formular-Feld name attr
Habe ich gebaut, eine Django-Formular senden zu einer Seite auf einer anderen domain (die ich nicht kontrollieren). Die Idee ist, dass ich eine schön gestaltete, sauber generiert, form, passt in meiner eigenen Website und führt den Nutzer woanders, wenn es eingereicht wird.
Jedoch
- Wenn die andere form ändert die Namen der Felder, die ich ändern müssen die Namen der Felder in meinem Formular, und ändern Sie dann die Namen, die überall in meiner Anwendung - da die
name
attr gekoppelt ist, um den Namen der Eigenschaft für das Feld. - Wenn der remote-Formular verwendet, dumme Namen dann meine form-Objekt muss ebenfalls über Eigenschaften verfügen mit dummen Namen, die verpestet meine Anwendung code.
- Sollten diese Namen zufällig reservierte Wörter in Python (z.B.
from
), dann ist es schwierig oder unmöglich, zum erstellen einer Django-Formular-Objekt-Darstellung.
Gibt es eine Möglichkeit, wenn Sie eine andere Zeichenfolge verwenden, für die 'name' - Attribut, wenn das Feld angezeigt wird? Also, Entkopplung des HTML-Formulars von der Klasse, die Sie repräsentiert.
Diesem würde müssen zwei Komponenten:
- Überschreiben der name-Wert im widget
- Das Formular Lesen Sie diesen Wert aus Anfrage.POST, wenn es gebunden ist
Brauche ich nur Schritt 1 in diesem Fall, aber Schritt 2 ist, relevante Probleme zu lösen, die ich oben aufgelistet allgemein
InformationsquelleAutor der Frage adamnfish | 2012-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine ziemlich schreckliche Missbrauch der API, aber es gibt eine Formular-Methode genannt
add_prefix
aufgerufen wird, um zu bestimmen, was die HTML-Namen der einzelnen Felder werden sollte, unter Berücksichtigung der form Präfix, falls vorhanden. Könnte man überschreiben, so dass es aussieht, bis das Feld name in einem Wörterbuch irgendwo und gibt den Namen, den Sie wollen - nicht zu vergessen, um die Erhaltung der bestehenden Präfix Verhalten:InformationsquelleAutor der Antwort Daniel Roseman
Ich habe implementiert eine einfache Funktion, die überschreibt das widget
render
Methode und weist Ihr einen benutzerdefinierten Namen:Die Nutzung ist einfach:
InformationsquelleAutor der Antwort GaretJax
Ihrer Beschreibung ("Wenn die andere form ändert die Namen der Felder, die ich ändern müssen die Namen der Felder in meinem Formular, und ändern Sie dann die Namen, die überall in meiner Anwendung - da ", "Wenn der remote-Formular verwendet, dumme Namen dann meine form-Objekt muss ebenfalls über Eigenschaften verfügen mit dummen Namen, die verpestet meine Anwendung code.") Sie erkennen dies als eine fragile design-Entscheidung.
Sollten Sie Bedenken, dass Ihr view-Funktion völlig löst dieses problem, in einer trivialen Weise.
Eher als align-Namen zwischen die remote-Anwendung und Ihre Anwendung, verwenden, Ihre view-Funktionen zum anzeigen von Ihrem schönen Namen, deren schreckliche Namen.
Dies ist, was die view-Funktionen sind für.
Nehmen es einen Schritt weiter, Ihre view-Funktion macht drei Dinge.
httplib
oderurllib2
oder was auch immer).Positionen 1 und 3 nicht viel ändern.
Element 2 ist eine Feld-für-Feld-mapping von der Anfrage.BEITRAG zu einem Wörterbuch mit dem du dann die url lib.urlencode zum erstellen der POST-Anforderung. (Oder was auch immer das Protokoll ist.)
Ausbrechen, damit Punkt 2 in eine flexible Sache, Sie geben in Ihren Einstellungen.
Einstellungen
In Ihrem views.py
Hinzufügen der mapping-Modul zu Ihrer Applikation
module.py
InformationsquelleAutor der Antwort S.Lott
Merke ich, diese Frage ist alt, aber hier ist eine andere (möglicherweise sauberer) Weg, es zu tun. Die meisten Antworten hier beteiligen monkey-patching oder überschreiben einer superclass-Methode. Dies gilt als gut, aber ich denke, es ist eine saubere Art und Weise, es zu tun.
Erstellen Sie ein neues Widget, erstreckt sich das widget, das Sie benötigen, wie TextInput:
Django nennt build_attrs auf ein widget, während die render () - operation. In der Methode, ich bin entfernen 'name', wenn es in die Wörterbücher. Dies entfernt effektiv den Namen, kurz bevor es gerendert wird.
Diese Antwort überschreibt, so wenig wie möglich von der Django-API.
In eine meiner Websites, die Zahlung Prozessor braucht inputs zu sein, ohne Namen. Hier ist die control-Deklaration in der form-Klasse:
Cheers.
InformationsquelleAutor der Antwort Conan Albrecht
Ist es einfach. Nutzen Sie einfach das Attribut 'Etiketten' class Meta:
wo 'neuer name' wird der name angezeigt, im html.
InformationsquelleAutor der Antwort Bruno Cordeiro