suddividere un ManyToManyField su più campi modulo in un ModelForm
-
19-08-2019 - |
Domanda
Quindi ho un modello con ManyToManyField chiamato tornei. Ho un ModelForm con due campi torneo:
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())
I metodi dopo tutto () ci sono da un QuerySet sottoclassato. Quando sto salvando il modulo dal mio punto di vista lo faccio così:
post.tournaments = (post_form.cleaned_data.get('pay_tourns')
+ post_form.cleaned_data.get('rep_tourns'))
Comunque, tutto funziona bene. Quello che non riesco a capire come fare è compilare questi campi del modulo quando sto caricando un post esistente. Cioè, quando passo istanza = invio al modulo. Qualche idea?
Soluzione 2
Paolo Bergantino era sulla buona strada e mi ha aiutato a trovarlo. Questa era la soluzione:
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()]
Altri suggerimenti
Potresti fare qualcosa del genere su 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)
Non vedo perché non funzionerebbe, ma lo proverò solo per assicurarmi ...
EDIT: testato e funziona.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow