Django form mit Möglichkeiten, aber auch mit der freetext-Variante?
Was ich Suche: Ein widget, dass gibt dem Benutzer eine drop-down-Liste der Möglichkeiten, aber dann auch noch ein text-Eingabe-Feld unterhalb der für den Benutzer einen neuen Wert eingeben.
Backend-Modell hätte eine Reihe von Standard-Möglichkeiten (aber nicht die Entscheidungen, keyword, auf das Modell). Ich weiß, ich kann (und habe ich) realisiert dies, indem er die form haben beide eine ChoicesField und CharField und code verwenden Sie die CharField, wenn ChoicesField ist auf dem Standard belassen, aber das fühlt sich "un-django" gefallen.
Gibt es eine Möglichkeit (entweder mit Django-gelieferten oder eine Django-plugin) definieren, so etwas wie ChoiceEntryField (nach dem Vorbild des GtkComboboxEntry die IIRC tut dies) für eine form?
Falls sich jemand findet, dieser, Hinweis, dass es eine ähnliche Frage, wie Sie am besten das tun, was ich suchte, war von einer UX-Perspektive, https://ux.stackexchange.com/questions/85980/is-there-a-ux-pattern-for-drop-down-preferred-but-free-text-allowed
InformationsquelleAutor Foon | 2014-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde empfehlen ein custom-Widget-Ansatz, über HTML5 können Sie eine Freitext-Eingabe mit dropdown-Liste die funktionieren würde als wählen-ein-oder-schreiben-anderen Art von Feld, das ist, wie ich es gemacht:
fields.py
forms.py
views.py
Ich mag es immer noch für einige Anwendungsfälle ... so ein Häkchen
Ich mochte das auch, und benutze es. Aber ich habe gerade bemerkt das unterschiedliche Verhalten zwischen den Browsern. In Safari sehe ich ein Textfeld. Ich einen Buchstaben eingeben, und dann kann ich auswählen von Werten in einem drop-down angezeigt wird. Das funktioniert OK. In Chrome sehe ich einen Pfeil in die text-box, die beim anklicken zeigt mir eine sehr hässliche, rohe version der Liste von Tupeln (die Entscheidungen, die von meinem Modell field) das ist die data_list. Nicht schön. Aber ich denke, wenn ich wechseln können, nur eine flache Liste, wie im Beispiel hier, die Chrom-Ansicht würden im wesentlichen ein editierbares drop-down.
Eigentlich war die Absicht, ich habe es in einem Projekt, wo wir benötigten ein drop-down -, sondern der Nutzer kann neue Daten einfügen. Für Projekte, die erfordern eine Menge der Erfassung von Daten, die der Benutzer am Ende lieber geben Sie den ersten Buchstaben ein, um zu sehen, ob die option vorhanden ist, und beenden Sie die Eingabe der tut es nicht.
Ich glaube, dass einige browser Probleme mit datalists motiviert diese alternative Awesomplete. Außerdem habe ich geschrieben, eine Python 3 Gist basierend auf dieser Antwort, die verwendet Tupel-Listen, pro Django Entscheidungen
InformationsquelleAutor Viktor eXe
Ich weiß, ich bin ein bisschen spät, um der Partei, aber es gibt eine andere Lösung, die ich kürzlich verwendet haben.
Habe ich die
Input
- widget von django-floppyforms mit einemdatalist
argument. Dies erzeugt eine HTML5<datalist>
element, für welches Sie Ihren browser erstellt automatisch eine Liste von Vorschlägen (siehe auch diese SO beantworten).Hier ist, was für ein Modell könnte dann einfach so Aussehen:
InformationsquelleAutor Chriki
Edit: aktualisiert, damit es funktioniert mit UpdateView sowie
Also das, was ich suchte zu sein scheint
utils.py:
Beispiel verwenden
(forms.py)
(Beispiel-dummy model.py🙂
(Beispiel-dummy views.py:)
Danke, @jamylak. Dies funktioniert gut für mich mit CreateView. Aber mit UpdateView, wird das widget nicht initialisiert, mit dem vorhandenen Wert. Es ist nicht gebunden an die Instanz, und ich kann nicht herausfinden, wie man manuell den Wert der ChoiceField und CharField. Haben Sie zufällig irgendwelche Anleitungen?
Diese Antwort war nicht von mir
Sorry! Mein schlechtes. Mein Kommentar war für @Foon.
dachte ich antwortete gestern, aber anscheinend hat der Kommentar verloren gegangen... auf der Suche auf das jetzt, aber nur, falls ich nicht Antworten... ich habe versucht Victor eXe ' s Antwort; es gibt einige sonderbare, auf der HTML-rendering-in meinem test, die kann oder kann nicht meine Schuld sein, aber seine Taten handle Erstellen und UpdateViews, so möchten Sie vielleicht zu sehen, dass.
InformationsquelleAutor
Würden Sie die Art des Eingangs identisch, sowohl in der Wahl-und text-Felder? Wenn dem so ist, würde ich einen einzigen CharField (oder Textfield) in der Klasse und haben einige front-end-javascript/jquery aufpassen, welche Daten weitergegeben werden, indem ein ", wenn keine Informationen in der dropdown-Liste verwenden von Daten in textfield" - Klausel.
Machte ich einen jsFiddle um zu demonstrieren, wie Sie dies auf dem frontend.
HTML:
JS:
können Sie dann auf Einreichen, anzugeben, welcher Wert übergeben werden, um Ihre Ansicht.
InformationsquelleAutor AlexJerez
Ich hatte das ähnliche Anforderungen wie OP, aber mit dem Basis-Feld ist ein DecimalField. So könnte der Benutzer geben Sie eine gültige floating point Zahl, oder wählen Sie aus einer Liste von optionalen Entscheidungen.
Ich mochte Austin Fox 's Antwort, dass es folgt das django-framework ist besser als Viktor eXe' s Antwort. Erben von der ChoiceField - Objekt ermöglicht es, den Bereich zu verwalten, einen array von option-widgets. So wäre es verlockend, zu versuchen;
Aber ist die Annahme, dass das Feld muss etwas beinhalten, erscheint in der Auswahl-Liste. Es ist ein handliches valid_value Methode, die Sie überschreiben können, um zu ermöglichen, einen beliebigen Wert, aber es ist ein größeres problem - die Bindung an einen dezimal-Modell Bereich.
Grundsätzlich alle ChoiceField Objekte verwalten, Listen von Werten, und dann über einen index oder mehrere Auswahl-Indizes, die für die Auswahl. So gebundenen Daten wird in dem widget angezeigt, wie;
Damit Austin Fox überschreiben der format_value Methode, um wieder zurück zu einem Basis-Input-Methode der Klasse version. Werke für charfield, aber nicht für Decimal oder Float-Felder, weil wir alles verlieren, die Besondere Formatierungen in der Anzahl widget.
So war meine Lösung zu Erben direkt von Dezimal Feld, aber es nur die Wahl Eigenschaft (gehoben von django CoiceField)....
Zuerst die benutzerdefinierte widgets;
Das Benutzerdefinierte Feld Klasse
Die html-templates
datalist.html
datalist_option.html
Ein Beispiel für die Verwendung. Beachten Sie, dass das zweite element der Wahl Tupel wird nicht benötigt, der HTML-datalist-option-tag, also lasse ich Sie wie Keine. Auch das erste Tupel mit dem Wert kann es sich um text oder native dezimal - Sie können sehen, wie das widget behandelt.
InformationsquelleAutor glenn mazengarb
Hier, wie ich dieses problem gelöst. Ich wieder Auswahl aus dem übergebenen template
form
Objekt und füllendatalist
manuell:InformationsquelleAutor Dmitrii
Ich weiß, das ist alt, aber dachte, das könnte nützlich sein für andere.
Die folgenden erreicht ein ähnliches Ergebnis zu Viktor eXe Antwort, aber Sie funktioniert für die Modelle, querysets, und foreign keys mit django native Methoden.
In forms.py Unterklasse bildet.Wählen Sie und Formen.ModelChoiceField:
Erstellen Sie dann die listtxt.html Vorlagen:
Und jetzt können Sie entweder das Element oder Feld in Ihrer forms.py:
Widget-und Feld-arbeiten auch in der form.ModelForm Formen und akzeptieren die Attribute.
InformationsquelleAutor Austin Fox