Pregunta

Entonces tengo un modelo con ManyToManyField llamado torneos. Tengo un ModelForm con dos campos de 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())

Los métodos después de todo () existen de un QuerySet subclasificado. Cuando guardo el formulario en mi vista, hago lo siguiente:

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

De todos modos, todo esto funciona bien. Lo que no puedo entender cómo hacer es completar estos campos de formulario cuando estoy cargando una publicación existente. Es decir, cuando paso instancia = publicación al formulario. ¿Alguna idea?

¿Fue útil?

Solución 2

Paolo Bergantino estaba en el camino correcto y me ayudó a encontrarlo. Esta fue la solución:

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()]

Otros consejos

Podría hacer algo como esto con 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)

No veo por qué eso no funcionaría, pero voy a probarlo solo para asegurarme de que ...

EDITAR: Probado y funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top