Estoy usando un TabularInline en el administrador de Django, configurado para mostrar un formulario en blanco adicional.Accediendo a la instancia del modelo principal de modelform of admin inline
class MyChildInline(admin.TabularInline):
model = MyChildModel
form = MyChildInlineForm
extra = 1
El modelo se parece MyParentModel-> MyChildModel-> MyInlineForm.
Estoy usando un formulario personalizado para poder buscar dinámicamente los valores y completar las opciones en un campo. p.ej.
class MyChildInlineForm(ModelForm):
my_choice_field = forms.ChoiceField()
def __init__(self, *args, **kwargs):
super(MyChildInlineForm, self).__init__(*args, **kwargs)
# Lookup ID of parent model.
parent_id = None
if "parent_id" in kwargs:
parent_id = kwargs.pop("parent_id")
elif self.instance.parent_id:
parent_id = self.instance.parent_id
elif self.is_bound:
parent_id = self.data['%s-parent'% self.prefix]
if parent_id:
parent = MyParentModel.objects.get(id=parent_id)
if rev:
qs = parent.get_choices()
self.fields['my_choice_field'].choices = [(r.name,r.value) for r in qs]
Esto funciona bien para los registros en línea con destino a un registro real, sino por la forma en blanco adicional, no se muestra ningún valor en mi campo de elección, ya que no tiene ningún ID de registro y hay no se puede buscar el registro MyParentModel asociado.
He inspeccionado todos los valores que pude encontrar (args, kwargs, self.data, self.instance, etc.) pero no encuentro ninguna forma de acceder al objeto principal al que está vinculado el tabular en línea. ¿Hay alguna manera de hacer esto?
+1, aunque no estoy seguro de lo que era exactamente @Cerin tratando de resolver, la mayor parte del tiempo debería ser más fácil de usar inlines genéricos y el uso la instancia de formset para verificar el tipo de contenido y el id_objeto. –
Intenté esto, pero obtengo un KeyError para 'parent_object' en la línea de MyForm donde intenta mostrar el valor parent_object. – platzhersh
Acabo de probar esto. No funciona – Cerin