2010-07-18 79 views
3

我有一個Django模型:在運行時設置Django ModelForm可見字段?

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) 

從那裏,我創建了一個的ModelForm:

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

我希望能夠表現出我的模板對應於特定信息的形式件用戶可以改變。例如,如果我想讓客戶更改他們的名字,我希望能夠顯示僅包含字段'first_name'和'last_name'的表單。要做到這一點是創建爲每個不同的場片段的的ModelForm

的一種方式......作爲名稱例如,它看起來是這樣的:

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

這似乎相當不雅,僵化。我想要做的是能夠在運行時指定字段,所以當我將字典從視圖傳遞到模板時,我可以設置要顯示的字段。我如何設置它,以便在運行時設置表單的字段?我最想要的傳遞到像這樣的最終解釋:

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

然後,我知道,每當我輸出name_change_form.as_p,這將有正是我要找的表單字段。

想法?也隨時推薦一個更好的方式來做到這一點。

回答

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')) 
相關問題