我有很强的PHP / ZEND背景,现在我正在学习Python / Django。在Zend中,您可以随时使用表单元素对象并对其进行编辑。这很棒,因为您可以根据需要获取表单对象并对其进行小的更改,而无需创建全新的表单对象。我试图这样做是在Django。
我有一张表格。让我们称之为投票。此表单可能需要在不同的视图方法中应用不同的窗口小部件。我不想用这么小的改变重新创建整个表单......
即
form = VoteForm(initial={})
## then something like
form.field.widget = newWidget
基本上, 我想在视图中创建对象后修改模型表单元素...
答案 0 :(得分:4)
你回答了自己的问题:那几乎就是你怎么做的!
# tested on 1.2.3
form = VoteForm(initial={})
form.fields['field_name'].widget = forms.HiddenInput() # make sure you call widget()
form.as_p() # shows new widget
答案 1 :(得分:1)
另一种方法是覆盖表单的 init ()方法,如:
class VoteForm(forms.Form):
myfield = ...
def __init__(self, hide_field=False, *args, **kwargs):
super(VoteForm, self).__init__(*args, **kwargs)
if hide_field:
self.fields['myfield'].widget = ...
form = VoteForm(hide_field=True, initial={})
我个人更喜欢这种方法,将所有形式逻辑保存在一个地方而不是四处传播。假设您的表单和视图位于单独的文件中,这意味着您不必执行多个“来自django导入表单”来获取视图中的小部件。