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?

È stato utile?

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
scroll top