我有一个Web报告,它使用Django表单(新表单)来控制用于生成报告的查询的字段(开始日期,结束日期......)。 我遇到的问题是页面应该使用表单的初始值(未绑定),但我无法访问cleaning_data字段,除非我调用is_valid()。 但is_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_data上的异常,这不是有效字段,因为尚未调用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'])

也就是说,没有一个通用的接口来检索绑定表单和未绑定表单之间的表单值。

有没有人看到更清洁的方式来做到这一点?

===============>>#1 票数:4 已采纳

如果将此方法添加到表单类:

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'))

===============>>#2 票数:2

Unbound意味着没有与表单关联的数据(初始或稍后提供),因此验证可能会失败。 正如其他答案(以及您自己的结论)中所述,您必须提供初始值并检查绑定数据和初始值。

表单的用例是表单处理验证,因此在访问cleaned_data之前必须有一些数据要验证。

===============>>#3 票数:0

您可以将初始值的字典传递给表单:

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} )
...

请参阅官方表单API文档 ,他们将在此处演示此文档

编辑 :根据其他用户的答案,也许这是最干净的解决方案:

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'])

我没有试过这个; 有人可以证实这有效吗? 我认为这比创建一个新方法更好,因为这种方法不需要其他代码(可能不是你编写的)来了解你的新“魔术”访问器。

  ask by davidavr translate from so

未解决问题?本站智能推荐:

1回复

表单数据未绑定到Django中动态添加的内联表单集中

我有一个关于在Django中动态添加内联表单集的验证的问题。 好像我在实现中缺少一些东西。 这是我的情况:我的项目是一个团队管理平台。 一个团队称为乘员组,可以有多个时间表。 每个时间表可以有几个班次。 请看一下我的代码。 目前,如果所有字段均有效,我便可以创建带有多个动态添加的
3回复

表单未提交值

我在Django中有一个HTML表单,但没有使用Django表单类。 现在,我想知道如何处理此HTML表单? (方法是POST ) 该表单由xsl生成,但最终生成的表单是这样的: 和视图: urls.py: 错误:
1回复

发布表单值未显示

这是我的HTML表格 但是,当我查看我的请求信息时,我获得的唯一POST值是“ csrfmiddlewaretoken”,而不是start_lng,start_lat等任何值。
1回复

Django表单未插入表单值

我有一个由模型生成的from。 我可以保存表单,但是表单数据没有插入表中。 出现插入,但是有空白数据。 任何帮助将不胜感激。 models.py views.py 表格
1回复

使用angularJs时,Django表单实例未显示默认值

在views.py中 在Forms.py中 在Html中: 但问题是当输入“Amit”的值没有显示在Design.It显示空白值时,当我通过JavaScript从控制台获得值也返回空白值时,我怎么能显示这个值?
2回复

在表单中添加字段后,表单未运行

朋友,我使用forms.py类制作了一个表单,该表单运行平稳,但是下次当我在该forms.py类中添加两个新字段时,然后在执行命令“ python manage.py syncdb”时,会得到以下结果错误:
1回复

Django表单未显示在模板中

我试图创建一个“编辑配置文件”页面/表单,并按照SimpleIsBetterThanComplex教程进行了有关如何通过OneToOne链接扩展用户模型的教程。 但是,当我尝试显示用户个人资料表单以允许用户更新其个人资料时,除了“提交”按钮外,该表单根本不显示...我可能在这里出错的任何想法?
3回复

如何使用ModelForm过滤Django表单中的值?

我正在尝试使用ModelForm来添加我的数据。 它运行良好,但ForeignKey下拉列表显示所有值,我只希望它显示与登录用户相关的值。 这是我的ExcludedDate模型,我要添加的记录: 以下是类别的模型,该表是包含我希望用户限制的关系的表: 最后,表单代码:
1回复

如何使用模型中的值初始化Django表单

我正在建立一个购物网站,我正在尝试使用产品信息来初始化我的产品更新表格,但是我无法从模型中获取信息。 模型功能 form.py view.py 更新表格
3回复

使用Django框架在Python中获取表单值

我的问题是不使用Model或forms.Form我们可以使用Django request对象在提交时获取表单值。 这是一个解释问题的小例子。 HTML代码: views.py代码: 因此,这里的键值始终为空。 我已经学习并有能力使用Model和forms:Form创