variable template tag extender examples bootstrap django python-2.7 django-forms django-admin inline

template - extender html django



Django obtiene instancia en forma de administrador en lĂ­nea (2)

Tener una clase de formulario en línea:

class ItemColorSelectForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(ItemColorSelectForm, self).__init__(*args, **kwargs) #here i need current object

Clase en línea:

class ItemColorSelectInline(generic.GenericTabularInline): model = ColorSelect extra = 1 form = ItemColorSelectForm

Clase de administración

class ItemAdmin(admin.ModelAdmin): inlines = [ItemColorInline,]

Pregunta: ¿cómo puede obtener un objeto actual en ItemColorSelectForm ?

print kwargs return:

{''auto_id'': u''id_%s'', ''prefix'': u''catalog-colorselect-content_type-object_id-__prefix__'', ''empty_permitted'': True}


La solución aceptada actualmente no es segura para subprocesos . Si le importa la seguridad de los hilos, nunca, nunca asigne una instancia a una propiedad de clase estática.

Las soluciones seguras para el hilo son:

Para Django 1.7 <1.9 (posiblemente versiones anteriores, poco claro):

from django.utils.functional import cached_property def get_formset(self, *args, **kwargs): FormSet = super(InlineAdmin, self).get_formset(*args, **kwargs) class ProxyFormSet(FormSet): def __init__(self, *args, **kwargs): self.instance = kwargs[''instance''] super(ProxyFormSet, self).__init__(*args, **kwargs) @cached_property def forms(self): kwargs = {''instance'': self.instance} forms = [self._construct_form(i, **kwargs) for i in xrange(self.total_form_count())] return forms return ProxyFormSet

A partir de Django 1.9 > = también es posible pasar form_kwargs:

def get_formset(self, *args, **kwargs): FormSet = super(InlineAdmin, self).get_formset(*args, **kwargs) class ProxyFormSet(FormSet): def __init__(self, *args, **kwargs): form_kwargs = kwargs.pop(''form_kwargs'', {}) form_kwargs[''instance''] = kwargs[''instance''] super(ProxyFormSet, self).__init__( *args, form_kwargs=form_kwargs, **kwargs) return ProxyFormSet

Las soluciones anteriores harán que un kwarg de instancia esté disponible en la forma del modelo:

class InlineForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(InlineForm, self).__init__(*args, **kwargs) print(''instance'', kwargs[''instance''])


Solución: anule el método formset en la clase Inline

def get_formset(self, request, obj=None, **kwargs): InlineForm.obj = obj return super(InlineAdmin, self).get_formset(request, obj, **kwargs)