2010-11-27 25 views
8

Quiero hacer que admin add-form sea dinámico. Quiero agregar pocos campos de formulario dependiendo de la configuración en el objeto relacionado.Formularios dinámicos en django-admin

tengo algo como esto:

class ClassifiedsAdminForm(forms.ModelForm): 


    def __init__(self,*args, **kwargs): 
    super(ClassifiedsAdminForm, self).__init__(*args, **kwargs) 
    self.fields['testujemy'] = forms.CharField(label = "test") 

Y en admin.py:

class ClassifiedAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     return ClassifiedsAdminForm 

Como se puede ver, quiero añadir "testujemy" CharField a admin complemento forma y el cambio -formar. Sin embargo, de esta manera no funciona. ¿Hay alguna manera de agregar campo en init? Está funcionando en vista normal.

Respuesta

8

He logrado hacerlo usando el tipo().

class ClassifiedAdmin(admin.ModelAdmin): 

def get_form(self, request, obj=None, **kwargs): 

    adminform = ClassifiedsAdminForm() 
    fields = adminform.getNewFields() 

    form = type('ClassifiedsAdminForm', (forms.ModelForm,), fields) 

    return form 

Espero que ayude a alguien.

+0

Gracias, gran trabajo, me ha ahorrado mucho tiempo averiguarlo :) – fijter

+0

Esto todavía me confunde mucho. Esperaría poder simplemente especificar la clase de formulario en la definición de la clase ModelAdmin. Aunque aprecio que hayas agregado esta respuesta; hay un par de otras preguntas de SO que parecen equivalentes pero que siguen sin respuesta o que no están completas. – rych

+0

Si esto no tiene sentido para usted, lea esto: http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python hasta que lo haga. Django usa metaclases de manera muy interna, particularmente con Modelos y Formas –