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)