2010-07-18 4 views
3

J'ai un modèle Django:Définir les champs visibles de Django ModelForm lors de l'exécution?

class Customer(models.Model): 
    first_name=models.CharField(max_length=20,null=True, blank=True) 
    last_name=models.CharField(max_length=25,null=True, blank=True) 
    address=models.CharField(max_length=60,null=True, blank=True) 
    address2=models.CharField(max_length=60,null=True, blank=True) 
    city=models.CharField(max_length=40,null=True, blank=True) 
    state=models.CharField(max_length=2,null=True, blank=True) 

À partir de là, je créé un ModelForm:

class CustomerForm(forms.ModelForm): 
    class Meta: 
    model=Customer 

Je voudrais être en mesure de montrer des morceaux de forme dans mon modèle correspondant à des informations spécifiques les utilisateurs peuvent changer. Par exemple, si je souhaite que les clients changent de nom, j'aimerais pouvoir afficher un formulaire contenant uniquement les champs «prénom» et «nom_famille».

Une façon de le faire serait de créer un ModelForm pour chacun des différents extraits de terrain ... pour l'exemple de nom, il ressemblerait à quelque chose comme:

class CustomerFormName(forms.ModelForm): 
    class Meta: 
    model=Customer 
    fields=('first_name','last_name') 

Cela semble assez inélégante, et inflexible . Ce que je voudrais faire, c'est pouvoir spécifier les champs à l'exécution, donc quand je passe le dictionnaire de la vue au modèle, je peux simplement définir les champs que je voudrais montrer. Comment puis-je le configurer de sorte que je définis les champs pour un formulaire lors de l'exécution? Je serais idéalement comme le dictionnaire dernier est passé à ressembler à quelque chose comme ceci:

{'name_change_form':CustomerFormName(<form with only first_name and last_name>), 'address_change_form':CustomerFormName(<form with only address fields>)} 

Ensuite, je sais que chaque fois que je sortie name_change_form.as_p, il va falloir exactement les champs de formulaire que je suis à la recherche.

Pensées? Aussi, n'hésitez pas à recommander une meilleure façon de le faire.

Répondre

5
from django.forms import ModelForm 
from wherever import Customer 
def formClassFactory(model,fields): 
    ff = fields 
    mm = model 
    class formClass(ModelForm): 
    class Meta: 
     model = mm 
     fields = ff 
    return formClass 
form_class = formClassFactory(('first_name','last_name')) 
Questions connexes