Django forme avec des choix, mais aussi avec freetext option?
Ce que je suis à la recherche de: Un simple widget qui donne à l'utilisateur une liste déroulante de choix mais aussi a une zone de saisie de texte en dessous pour l'utilisateur d'entrer une nouvelle valeur.
Le backend de modèle à une série de choix par défaut (mais n'utilisez pas le choix de mots clés sur le modèle). Je sais que je peux (et j'ai) a mis en place ce en ayant la forme ont à la fois un ChoicesField et CharField et disposez d'un code d'utilisation de la CharField si ChoicesField est laissé à la valeur par défaut, mais cela se sent "de l'onu-django", comme.
Est-il un moyen (soit à l'aide de Django-objets internes ou Django plugin) pour définir quelque chose comme ChoiceEntryField (sur le modèle de la GtkComboboxEntry qui IIRC à le faire) pour un formulaire?
Au cas où quelqu'un en trouve, notez qu'il y a une question similaire sur la meilleure façon de faire ce que je cherchais, à partir d'un UX point de vue à https://ux.stackexchange.com/questions/85980/is-there-a-ux-pattern-for-drop-down-preferred-but-free-text-allowed
Vous devez vous connecter pour publier un commentaire.
Je vous recommande un Widget personnalisé approche, HTML5 vous permet d'avoir un gratuit de saisie de texte avec une liste déroulante qui fonctionnerait comme un pick-l'un-ou-l'écriture d'un autre type de champ, c'est comment j'ai fait:
fields.py
forms.py
views.py
Je sais que je suis un peu en retard à la fête, mais il y a une autre solution que j'ai utilisé récemment.
J'ai utilisé le
Entrée
widget de django-floppyforms avec undatalist
argument. Cela génère un HTML5<datalist>
élément pour lequel votre navigateur crée automatiquement une liste de suggestions (voir aussi cette SORTE de réponse).Voici ce qu'un modèle de formulaire pourrait alors simplement ressembler à:
Edit: mise à jour pour le faire fonctionner avec UpdateView ainsi
Donc ce que je cherchais semble être
utils.py:
Exemple d'utilisation
(forms.py)
(Exemple de mannequin model.py🙂
(Exemple de mannequin views.py:)
J'ai eu la même exigence que l'OP mais avec le champ de base étant un DecimalField. Afin que l'utilisateur puisse entrer valide d'un nombre à virgule flottante ou le sélectionner dans une liste de choix facultatif.
J'ai aimé Austin Fox réponse en ce qu'elle suit le framework django mieux que Viktor eXe de réponse. Héritant de la ChoiceField objet permet de gérer un tableau de l'option widgets. Il serait donc tentant d'essayer;
Mais l'hypothèse est que le champ doit contenir quelque chose qui apparaît dans la liste de choix. Il y a une pratique valid_value méthode que vous pouvez modifier afin de permettre à toute valeur, mais il ya un gros problème de liaison à une décimale champ de modèle.
Fondamentalement, tous les ChoiceField objets gérer les listes de valeurs et ensuite avoir un indice ou plusieurs indices de sélection que représente la sélection. Ainsi lié de données apparaît dans le widget que
Donc Austin Fox substitution de la format_value méthode pour revenir à une base d'Entrée de la méthode de classe version. Fonctionne pour charfield, mais pas pour les Décimales ou Float champs parce que nous perdons toutes les mises en forme spéciales dans le nombre de widget.
Donc ma solution a été d'hériter directement de champ Décimal, mais en ajoutant que le choix de la propriété (levée de django CoiceField)....
D'abord les widgets personnalisés;
Le Champ Personnalisé De Classe
Les templates html
datalist.html
datalist_option.html
Un exemple d'utilisation. Notez que le deuxième élément du choix tuple n'est pas nécessaire par le code HTML datalist option tag, alors je les laisse comme Aucun. Aussi le premier tuple de la valeur peut être du texte ou des décimaux - vous pouvez voir comment le widget gère.
Serait le type d'entrée être identiques dans les choix et les champs de texte? Si oui, je voudrais faire une seule CharField (ou Textfield () dans la classe et ont une certaine front-end javascript/jquery prendre soin de ce que les données seront transmises par l'application d'un "si aucune information dans la liste déroulante utiliser les données dans le champ" clause.
J'ai fait un jsFiddle pour démontrer comment vous pouvez le faire sur le frontend.
HTML:
JS:
vous pouvez ensuite sur "soumettre", spécifier la valeur sera transmise à votre vue.
Voici comment j'ai résolu ce problème. J'ai récupérer choix de passé à un modèle
form
objet et remplissezdatalist
manuellement:Je sais que c'est vieux, mais pensé que cela pourrait être utile à d'autres.
La suite permet d'atteindre un résultat similaire à Viktor eXe réponse, mais fonctionne pour les modèles, querysets, et les clés étrangères avec django des méthodes indigènes.
Dans forms.py sous-classe des formes.Sélectionner et de formes.ModelChoiceField:
Ensuite créer le listtxt.html dans les modèles:
Et maintenant, vous pouvez utiliser le widget ou le champ dans votre forms.py:
Le widget et le terrain travaillent également dans la forme.ModelForm les Formulaires et accepter les attributs.