Cambiar queryset del campo del modelo en el formato en línea del modelo no principal

Estoy utilizando un formset en línea y necesito cambiar el conjunto de consultas de uno de los campos de formulario del modelo no principal cuando se crea una instancia del formset.

class Foo(Model): name = models.TextField() class Bar(Model): foo = models.ForiegnKey(Foo) other_model = models.ForeignKey(OtherModel) class BarForm(ModelForm): class Meta: model=Bar foo = Foo.object.get(id=1) FormSet = inlineformset_factory(Foo, Bar, form=BarForm) formset = FormSet(instance=foo) 

Dependiendo del valor de foo que no esté determinado hasta que ingrese el código de vista, debo modificar el queryset del campo ‘other_model’ en el BarForm para todas las formas en el formset. ¿Hay alguna forma de hacer esto?

Si lo entiendo correctamente, esto es lo que puede hacer … Puede anular BaseInlineFormSet y luego configurar manualmente el conjunto de consultas para ese campo en cada formulario del formulario.

Así que en tu formulario.py, harías esto:

 class BaseBarFormSet(BaseInlineFormSet): def __init__(self, other_model_queryset, *args, **kwargs): super(BaseInlineFormSet, self).__init__(*args, **kwargs) for form in self.forms: form.fields['other_field'].queryset = other_model_queryset 

Observe que el primer argumento de __init__ es el conjunto de consultas que desea establecer.

Luego, en la vista, solo modificarías tu código actual en consecuencia. Pase ese nuevo BaseBarFormSet en la función de fábrica:

 FormSet = inlineformset_factory(Foo, Bar, form=BarForm, formset=forms.BaseBarFormSet) # notice formset=forms.BaseBarFormSet 

Luego pase el queryset que desea para el otro campo a la clase FormSet real creada por la función de fábrica:

 formset = FormSet(OtherModel.objects.filter(…), instance=foo) #notice the first parameter 

Los conjuntos de formularios son muy complicados a veces, así que espero que tenga sentido … hazme saber si tienes problemas.