Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用未绑定表单中的表单值_Python_Django - Fatal编程技术网

Python 如何使用未绑定表单中的表单值

Python 如何使用未绑定表单中的表单值,python,django,Python,Django,我有一个web报表,它使用Django表单(新表单)来控制用于生成报表(开始日期、结束日期等)的查询的字段。我遇到的问题是页面应该使用表单的初始值(未绑定)工作,但除非调用is\u valid(),否则我无法访问已清理的数据字段。但是是有效的()在未绑定表单上总是失败 Django的表单似乎是用编辑数据的用例设计的,这样一个未绑定的表单除了显示HTML之外就没有其他用处了 例如,如果我有: if request.method == 'GET': form = MyForm() else:

我有一个web报表,它使用Django表单(新表单)来控制用于生成报表(开始日期、结束日期等)的查询的字段。我遇到的问题是页面应该使用表单的初始值(未绑定)工作,但除非调用
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)。如果在多个位置使用该表单,则必须重复默认值。