您好,登錄后才能下訂單哦!
我們在使用django定義好一個model后,可能需要添加或者修改model數據,此時可以借助于django提供的forms表單組件.
forms表單和model結合使用時,必須在Meta類中指定關聯的model和需要展示的字段(field)
django會自動根據每個字段的類型來生成適合的forms字段
如有一個外鍵字段,django會自動把他轉化成其關聯的對象而不是簡單的展示其關聯的id.
一個簡單的model關聯的forms表單定義,如FlowStageForm1.
class FlowStageForm1(forms.ModelForm):
class Meta:
model = WorkFlowStage
fields = '__all__'
exclude = ['work_type'] # 排除該字段
有時候forms默認的渲染可能不滿足我們的需求,這時就需要通過手動來定義部分字段來滿足我們的需求,沒有手動定義的字段django會默認幫我們渲染.
但是有時候只是想簡單的修改個小地方,如在所有的字段上添加一個默認的類,難道要把所有的字段都定義一遍嗎,很蛋疼.
研究了一下官方文檔,發現還是有方法的
可以在__init__初始化時直接循環所有的字段,給他們添加一些屬性,而不用重新定義他們.
如果一個表有10個字段,有九個字段有共同屬性,而有一個需要單獨定制widget,這時候只需在forms中單獨定義完,在__init__初始化添加通用屬性的時候排除他即可,見紅色代碼處.
再如果我們想改變字段widget但又想保留django提供的一些功能,如果一個字段是外鍵,當我們自動在forms中定義過后,就不能使用django默認的功能,需要手動寫代碼去關聯其對象,這時候可以在Meta中使用widgets來單獨定義該字段的widget同時保留了django提供的一些特性,這樣就完美了.
實例見FlowStageForm
# work_flow是WorkFlowStage的外鍵
class FlowStageForm(forms.ModelForm):
handler_id = forms.IntegerField(label="參與人ID", required=False,
widget=forms.HiddenInput())
hook_method_name = forms.CharField(label="鉤子程序方法名", required=False,
widget=forms.TextInput(attrs={'class': 'form-control'}))
class Meta:
model = WorkFlowStage
fields = '__all__'
exclude = ['work_type'] # 排除該字段
widgets = {
'work_flow': forms.Select(attrs={'class': 'form-control disabled', 'required': 'required'}), #work_flow是一個外鍵
'handler_id_display': forms.TextInput(attrs={'class': 'form-control disabled', 'required': 'required'})
}
def __init__(self, **kwargs):
super(FlowStageForm, self).__init__(**kwargs)
#保存用戶有自定義過的fields不對其進行更改.
declared_fields = []
if self.declared_fields: # 自定義過的field
declared_fields += list(self.declared_fields)
if self.Meta.widgets:
declared_fields += list(self.Meta.widgets) # 修改過widgets的部件.
attrs = {'class': 'form-control', 'required': 'required'}
for field in self.fields:
if field not in declared_fields: # 排除掉有過自定義的field
self.fields[field].widget.attrs.update(attrs)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。