Django, comment supprimer le choix vide du champ de choix dans modelform?
J'ai créé un modèle avec une clé étrangère:
class Book(models.Model):
library = models.ForeignKey(Library, null=False, blank=False)
...
Et puis j'ai créé un formulaire avec un ModelForm pour afficher aux utilisateurs:
class BookSubmitForm(ModelForm):
class Meta:
model = Book
Et quand j'affiche la page avec le formulaire, j'obtiens les choix de bibliothèque mais aussi le vide (--------) choix qui vient par défaut.
Je pensais en ayant null = False et blank = False dans le modèle qui se débarrasserait de ce choix vide dans le ModelForm mais non. Que puis-je faire pour n'avoir que des choix réels dans la liste et pas celui-là?
4 réponses
Voir ModelChoiceField. Vous devez définir empty_label sur None. Donc, votre code sera quelque chose comme:
class BookSubmitForm(ModelForm):
library = ModelChoiceField(queryset=Library.objects, empty_label=None)
class Meta:
model = Book
EDIT: a changé le nom du champ en minuscules
self.fields['xxx'].empty_label = None
ne fonctionnerait pas si le type de champ est TypedChoiceField
qui n'a pas de propriété empty_label
.
Que devons-nous faire est de supprimer le premier choix:
class BookSubmitForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BookSubmitForm, self).__init__(*args, **kwargs)
for field_name in self.fields:
field = self.fields.get(field_name)
if field and isinstance(field , forms.TypedChoiceField):
field.choices = field.choices[1:]
Si vous utilisez ModelForm alors vous n'avez pas à spécifier queryset, requis, étiquette, etc. Mais pour la réponse upvoted, vous devez le faire à nouveau.
En fait, vous pouvez le faire pour éviter de tout re-spécifier
class BookSubmitForm(ModelForm):
def __init__(self, *args, **kwargs):
super(BookSubmitForm, self).__init__(*args, **kwargs)
self.fields['library'].empty_label = None
class Meta:
model = Book
Si vous spécifiez blank=False
et default=<VALUE>
dans la définition du champ du modèle, Django ne rendra pas le choix vide par défaut; notez que la valeur par défaut peut être un choix invalide et définie sur ''
ou n'importe quel invalid choice
par exemple.
class Book(models.Model):
library = models.ForeignKey(Library, null=False, blank=False, default='')
...