2010-11-27 8 views
8

Je souhaite rendre dynamique l'ajout de formulaire. Je veux ajouter quelques champs de formulaire en fonction de la configuration dans l'objet connexe.Formulaires dynamiques dans django-admin

J'ai quelque chose comme ceci:

class ClassifiedsAdminForm(forms.ModelForm): 


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

Et admin.py:

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

Comme vous pouvez le voir, je veux ajouter "testujemy" CharField à admin add-forme et le changement -forme. Cependant, cette façon ne fonctionne pas. Est-il possible d'ajouter un champ dans init? Il travaille en vue normale.

Répondre

8

J'ai réussi à le faire en utilisant type().

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 

Espérons que cela aidera quelqu'un.

+0

Merci, bon travail, m'a sauvé beaucoup de temps à le découvrir moi-même :) – fijter

+0

Cela me confond encore grandement. Je m'attendrais à être capable de simplement spécifier la classe de formulaire dans la définition de classe ModelAdmin. J'apprécie votre ajout de cette réponse, cependant; il y a quelques autres questions de SO qui semblent équivalentes mais qui restent incomplètes ou incomplètes. – rych

+0

Si cela n'a pas de sens pour vous, lisez ceci: http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python jusqu'à ce que ce soit le cas. Django utilise beaucoup les métaclasses en interne, en particulier avec les modèles et les formulaires –

Questions connexes