dividir un ManyToManyField sobre múltiples campos de formulario en un ModelForm
-
19-08-2019 - |
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?
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.