Python 如何使用未绑定表单中的表单值
我有一个web报表,它使用Django表单(新表单)来控制用于生成报表(开始日期、结束日期等)的查询的字段。我遇到的问题是页面应该使用表单的初始值(未绑定)工作,但除非调用Python 如何使用未绑定表单中的表单值,python,django,Python,Django,我有一个web报表,它使用Django表单(新表单)来控制用于生成报表(开始日期、结束日期等)的查询的字段。我遇到的问题是页面应该使用表单的初始值(未绑定)工作,但除非调用is\u valid(),否则我无法访问已清理的数据字段。但是是有效的()在未绑定表单上总是失败 Django的表单似乎是用编辑数据的用例设计的,这样一个未绑定的表单除了显示HTML之外就没有其他用处了 例如,如果我有: if request.method == 'GET': form = MyForm() else:
is\u valid()
,否则我无法访问已清理的数据字段。但是是有效的()
在未绑定表单上总是失败
Django的表单似乎是用编辑数据的用例设计的,这样一个未绑定的表单除了显示HTML之外就没有其他用处了
例如,如果我有:
if request.method == 'GET':
form = MyForm()
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
如果这是一个GET(因为它是未绑定的),并且如果我这样做,is_valid()将失败:
if request.method == 'GET':
form = MyForm()
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
第一次调用do_query会触发form.cleaned_数据的异常,该数据不是有效字段,因为尚未调用is_valid()
。似乎我必须做一些事情,比如:
if request.method == 'GET':
form = MyForm()
do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
也就是说,在绑定表单和未绑定表单之间没有用于检索表单值的公共接口
是否有人能找到一种更简洁的方法来实现这一点?您可以将初始值字典传递给表单:
if request.method == "GET":
# calculate my_start_date and my_end_date here...
form = MyForm( { 'start_date': my_start_date, 'end_date': my_end_date} )
...
请参见,他们在其中演示了这一点
编辑:根据其他用户的回答,这可能是最干净的解决方案:
if request.method == "GET":
form = MyForm()
form['start_date'] = form['start_date'].field.initial
form['end_date'] = form['end_date'].field.initial
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
我还没试过这个;有人能证实这一点吗?我认为这比创建一个新方法要好,因为这种方法不需要其他代码(可能不是您编写的)来了解新的“magic”访问器。如果您将此方法添加到表单类中:
def get_cleaned_or_initial(self, fieldname):
if hasattr(self, 'cleaned_data'):
return self.cleaned_data.get(fieldname)
else:
return self[fieldname].field.initial
然后,您可以将代码重新编写为:
if request.method == 'GET':
form = MyForm()
else:
form = MyForm(request.method.POST)
form.is_valid()
do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date'))
未绑定表示没有与表单关联的数据(初始数据或稍后提供的数据),因此验证可能会失败。如其他答案(以及您自己的结论)中所述,您必须提供初始值并检查绑定数据和初始值
表单的用例是表单处理和验证,因此在访问
cleaned_data
是之前,您必须先验证一些数据,但默认值不会随表单一起定义(如字段声明中的initial=value)。如果在多个位置使用该表单,则必须重复默认值。