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à?

24
demandé sur Collin Allen 2012-01-10 09:02:32

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

29
répondu Ilya 2016-10-04 09:06:15

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:]
9
répondu Mithril 2016-05-01 19:38:37

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 
7
répondu Henry Liu 2015-04-03 09:33:20

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='')
    ...
7
répondu Daniel Sokolowski 2016-10-06 01:04:18