Choix non mis à jour dans le champ à choix multiples de Django

Django:1.10

Après avoir écrit l'article suivant, j'ai trouvé le problème que j'ai écrit dans "Addition 2016/11/26".

Comment générer une requête à l'aide de l'opérateur IN dans Django http://qiita.com/nakkun/items/86a94e65fe6785325f54

Lors de la création d'un champ de saisie pour sélectionner un auteur dans MultipleChoiceField, j'ai obtenu une liste d'auteurs qui peuvent être sélectionnés dans la base de données et l'ai passée aux choix, mais même si j'ajoute un auteur, cela ne se reflète pas à l'écran à moins que le serveur ne soit redémarré.

Vous pouvez l'attribuer dans la vue, mais je veux que Form fasse le formulaire.

Je n'avais pas encore étudié les classes Python, alors je me demandais si cela serait à portée d'application.

Quand je lis le livre Python à la fin de l'année et au début de l'année, je vois, la valeur est attribuée lors de la création de l'objet de classe. En d'autres termes, c'est un champ statique en Java.

Donc, je l'ai modifié pour remplacer les choix lors de la création d'une instance.

forms.py


class SearchForm(forms.Form):

    author = forms.MultipleChoiceField(label='Auteur', widget=forms.CheckboxSelectMultiple, required=False)

    def __init__(self, param):
        forms.Form.__init__(self, param)
        self.fields['author'].choices = [(author.id, author.name) for author in Author.objects.all()]

Maintenant, il suffit de recharger le navigateur pour refléter l'ajout de l'auteur.

Postscript 09/01/2017

J'ai reçu vos commentaires dans les commentaires et j'ai trouvé que c'était plus facile à faire.

forms.py


class SearchForm(forms.Form):

    author = forms.ModelMultipleChoiceField(
        label='Auteur', widget=forms.CheckboxSelectMultiple, required=False,
        queryset=Author.objects.all(), to_field_name='name')

Vous pouvez le faire avec juste ça!

Postscript 11/01/2017

J'ai reçu d'autres commentaires. Il peut maintenant être mis à jour en passant un objet appelable aux choix sans utiliser ModelMultipleChoiceField.

forms.py


class SearchForm(forms.Form):

    author = forms.MultipleChoiceField(
        label='Auteur', widget=forms.CheckboxSelectMultiple,
        choices=lambda: [(author.id, author.name) for author in Author.objects.all()], required=False)

Vous pouvez le faire aussi!

Recommended Posts

Choix non mis à jour dans le champ à choix multiples de Django
Auto_now de Django peut ne pas être mis à jour