Personnaliser/suppression de Django sélectionnez zone vide de l'option
Je suis en utilisant Django 1.0.2. J'ai écrit un ModelForm soutenu par un Modèle. Ce modèle a une ForeignKey où vide=False. Lorsque Django génère du code HTML de cette forme, il crée une zone de sélection, avec une option pour chaque ligne dans la table référencée par la clé etrangère. Il crée également une option en haut de la liste qui n'a pas de valeur et s'affiche comme une série de tirets:
<option value="">---------</option>
Ce que j'aimerais savoir, c'est:
- Quelle est la façon la plus propre pour enlever cette auto-généré option dans la boîte de sélection?
-
Quelle est la façon la plus propre de le personnaliser pour qu'il montre que:
<option value="">Select Item</option>
Dans la recherche d'une solution, je suis tombé sur Django billet 4653 qui m'a donné l'impression que les autres avaient la même question, et que le comportement par défaut de Django peut avoir été modifié. Ce billet est de plus d'un an donc j'espérais qu'il pourrait être le moyen le plus propre pour accomplir ces choses.
Merci pour toute aide,
Jeff
Edit: j'ai configuré le champ ForeignKey en tant que tel:
verb = models.ForeignKey(Verb, blank=False, default=get_default_verb)
Ce n'est, par défaut, de sorte qu'il n'est plus le vide/tirets option, mais malheureusement, il ne semble pas résoudre les problèmes de mes questions. C'est le vide/tirets option apparaît toujours dans la liste.
- S'avère que c'est considéré comme un bug dans Django, devrait supprimer l'option vide automatiquement dans ce cas: code.djangoproject.com/ticket/10792
Vous devez vous connecter pour publier un commentaire.
N'ai pas testé, mais basée sur la lecture de Django reinhardt, code ici et ici je crois que cela devrait fonctionner:
MODIFIER: C'est documenté, bien que cela ne soit pas nécessairement savoir rechercher ModelChoiceField si vous travaillez avec un auto-généré ModelForm.
MODIFIER: Comme jlpp notes, dans sa réponse, ce n'est pas complète - que vous avez à ré-attribuer le choix pour les widgets, après modification de la empty_label attribut. Puisque c'est un très orthodoxe, l'autre option qui pourrait être plus facile à comprendre, c'est juste primordial de l'ensemble de la ModelChoiceField:
de la documentation
afin de définir la valeur par défaut et que vous êtes ok
Avec Carl de répondre en tant que guide et après l'enracinement autour de Django source pour un couple d'heures, je pense que c'est la solution complète:
Pour supprimer l'option vide (extension de Carl exemple):
Pour personnaliser l'option "vide" de l'étiquette est essentiellement le même:
Je pense que cette approche s'applique à tous les scénarios où ModelChoiceFields sont rendus au format HTML, mais je ne suis pas positif. J'ai constaté que lorsque ces champs sont initialisés, leurs choix sont transmis à l'widget de sélection (voir django.les formulaires.champs.ChoiceField._set_choices). Réglage de la empty_label après l'initialisation n'actualise pas le widget de sélection de la liste de choix. Je ne suis pas assez familier avec Django de savoir si cela devrait être considéré comme un bug.
Vous pouvez l'utiliser sur votre modèle:
par défaut=None est la réponse 😀
NOTE: j'ai essayé ce Django 1.7
blank=False
et toutdefault
valeur du jeu de pas rendre un vide de choix de l'option.Comme pour le django 1.4 tous vous avez besoin est de définir la valeur "par défaut" et "vide=False" sur le choix du champ
Voir ici pour compléter le débat sur les méthodes de résolution de ce problème.
vous pouvez le faire dans l'admin:
self.fields['xxx'].empty_value = None
ne fonctionnerait pas Si vous le type de champ estTypedChoiceField
qui n'ont pasempty_label
propriété.Ce que nous devons faire est d'enlever le premier choix:
1 . Si vous voulez construire une
BaseForm
détection automatiqueTypedChoiceField
2.seulement un peu de forme, vous pouvez utiliser:
self.fields['xxx'].choices = self.fields['xxx'].choices[1:]
si nous voulons supprimer de choix vide. Mais si vous voulez remplacer le titre vous avez besoin de "recréer" premier choix en tant que tuple avec le premier élément vide et le titre dans la deuxième, par exempleself.fields['xxx'].choices = [('', 'Nothing')] + self.fields['xxx'].choices[1:]
BaseForm
pour personnaliser tous, donc, à l'aide de la boucle.Pour un
ForeignKey
de champ, réglage de ladefault
de la valeur à''
sur le modèle de supprimer l'option blanc.Pour d'autres domaines comme la
CharField
vous pouvez définir ladefault
àNone
, mais cela ne fonctionne pas pourForeignKey
champs dans Django 1.11.J'ai été déconner avec ça aujourd'hui et juste venu avec un
lâche hackchouette solution:Maintenant, vous pouvez modifier la valeur par défaut
ModelChoiceField
vide étiquette pour tout ce que vous voulez. 🙂PS: Pas besoin de downvotes, non nocif de singe, les patchs sont toujours à portée de main.
Pour la dernière version de django
la première réponse devrait ressembler à ceci
Que je trouve une SOLUTION!!
Mais pas pour ForeignKey 🙂
Peut-être je peux vous aider.
J'ai regardé dans Django code source et a découvert que dans django.les formulaires.extras.les widgets.SelecteDateWidget() est une propriété appelée none_value qui est égal à (0, '-----') alors je l'ai fait dans mon code ce
self.fields[field_name].widget.choices[0] = ('', SOME_FIRST_CHOICE_DISPLAY_VALUE)
Il y a beaucoup de réponses ici, mais je ne suis toujours pas entièrement satisfait avec les implémentations. Je suis aussi un peu frustrée de sélectionner les widgets à partir de différentes sources (clés étrangères, les choix) rendement des comportements différents.
J'ai une conception que je suis en train de travailler avec où sélectionner les champs toujours ont une option blanc, et si elles sont nécessaires, elles auront une étoile à côté d'eux, et la forme ne sera tout simplement pas de valider s'ils sont vides. Cela dit, je ne peux que correctement remplacer la empty_label pour les champs qui ne sont pas
TypedChoiceField
s.Voici ce que le résultat devrait ressembler. Le premier résultat est toujours le nom du champ dans mon cas, le
label
.Voici ce que j'ai fini par faire. Ce qui suit est un substituée
__init__
méthode de mon formulaire:Depuis Django 1.7, vous pouvez personnaliser l'étiquette de la valeur à blanc par l'ajout d'une valeur à votre liste de choix dans votre modèle de définition de champ. À partir de la documentation sur la configuration de champ de choix:
J'ai vérifié la documentation pour les différentes versions de Django et trouvé que c'était ajouté dans Django 1.7.
Cela devient plus compliqué lorsque l' choix sont les clés étrangères et si vous voulez filtre le choix en fonction de certains critères. Dans ce cas, si vous définissez la
empty_label
puis ré-affecter le choix (vous pouvez appliquer de filtration ici aussi) le vide étiquette sera vide:bbasically, la première ligne sous
init
peut être appliquée à tous les champs du formulaire avec une boucle ou en ligne de boucle: