Question

J'ai donc un modèle avec un ManyToManyField appelé tournois. J'ai un ModelForm avec deux terrains de tournoi:

pay_tourns = forms.ModelMultipleChoiceField(
                        queryset=Tourn.objects.all().active().pay_tourns(),
                        widget=forms.CheckboxSelectMultiple())
rep_tourns = forms.ModelMultipleChoiceField(
                        queryset=Tourn.objects.all().active().rep_tourns(),
                        widget=forms.CheckboxSelectMultiple())

Les méthodes après tout () sont issues d'un sous-groupe QuerySet. Lorsque je sauvegarde le formulaire dans ma vue, je le fais ainsi:

post.tournaments = (post_form.cleaned_data.get('pay_tourns')
                                + post_form.cleaned_data.get('rep_tourns'))

Quoi qu'il en soit, tout cela fonctionne bien. Ce que je n'arrive pas à comprendre, c'est de remplir ces champs lorsque je charge un message existant. C'est-à-dire lorsque je passe instance = post au formulaire. Des idées?

Était-ce utile?

La solution 2

Paolo Bergantino était sur la bonne voie et m'a aidé à le trouver. C'était la solution:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

    instance = kwargs.get('instance')
    if instance:
        self.fields['pay_tourns'].initial = [ o.id for o in instance.tournaments.all().active().pay_tourns()]
        self.fields['rep_tourns'].initial = [ o.id for o in instance.tournaments.all().active().rep_tourns()]

Autres conseils

Vous pourriez faire quelque chose comme ceci avec le ModelForm:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

    instance = kwargs.get('instance')
    if instance:
        self.fields['pay_tourns'].queryset.filter(post=instance)
        self.fields['rep_tourns'].queryset.filter(post=instance)

Je ne vois pas pourquoi cela ne fonctionnerait pas, mais je vais le tester juste pour être sûr ...

MODIFIER: testé et cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top