【问题标题】:Django BooleanField keeps return False (empty) regardless if checked or not无论是否选中,Django BooleanField 都会返回 False(空)
【发布时间】:2012-01-07 11:38:18
【问题描述】:

如标题所述。即使选中,BooleanField 也不会返回 True。这把我逼疯了!

首先,我根据基于模型的字段 id 列表检索复选框。

forms.py

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        fields = Fields.objects.all()
        for field in fields:
            field_name = field.ID
            self.fields[field_name] = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class':'checkbox-small'}), label=field_name)

即使在 DOM 中选中,处理程序也永远不会返回 True。

models.py

def myFormHandler(request):
    siteDictionary = getDictionary(request)
    if request.method == 'POST':
        form = MyForm(request.POST, error_class=DivErrorList, auto_id='%s')
        if form.is_valid():
            fields = Fields.objects.all()
            for field in fields:
                if form.cleaned_data[field.ID]:
                    print "Finally returned true!"
    else:
        form = MyForm()
        siteDictionary['form'] = form
    return render_to_response('page.html', siteDictionary, context_instance=RequestContext(request))

有什么想法吗?感谢您的帮助。

编辑这是模板

<table cellspacing="0" cellpadding="0" border="0" class="table-all">
    <thead>
        <tr>
            <th><input type="checkbox" name="check" class="checkall checkbox-small" /></th>
            <th>Name</th>
        </tr>
    </thead>
    <tbody>
    {% for field in form %}
        <tr>
            <td>{{ field }}</td>
            <td>{{ field.label }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>

<div id="pager" class="pager">
<form method="post" action=".">{% csrf_token %}
        <button type="submit" class="green"><span>Submit</span></button>
</form>
</div>

【问题讨论】:

  • 模板是什么样的?

标签: django forms boolean models


【解决方案1】:

field.ID 是整数吗?如果是这样,您需要在生成field_name时将其强制转换为字符串。

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        fields = Fields.objects.all()
        for field in fields:
            field_name = str(field.ID)
            self.fields[field_name] = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class':'checkbox-small'}), label=field_name)

【讨论】:

  • 是的!这也是我的问题之一。 (我的表格位置也错了)。问题:为什么它是字符串还是整数很重要?在整个请求中,我仍然遵循整数索引。再次感谢你的帮助!我会投票,但我还没有 15 分 =(
  • 尝试在您的视图中打印 request.POST。您会看到所有的键都是字符串,因此 Django 无法将帖子数据与名称为整数的字段匹配。
  • 顺便说一句,我会避免使用以数字开头的名称和 ID(设置 auto_id='%s' 表示字段 ID 是数字)这在 HTML 4 中无效(请参阅 the spec) ,虽然在 HTML5 中没问题。在某些浏览器中可能无关紧要,但迟早可能会导致一些奇怪的行为,需要一个下午才能追踪。
【解决方案2】:

您的字段不在 HTML 表单元素中,因此不会提交。

【讨论】:

  • 是的,先生!无论如何,这是问题的一部分(我之前在表格中拥有所有内容,但出于某种原因,我认为出于挫败感而将其取出)。 Alasdair 的建议也是必要的。我的字段 ID 是整数,将它们转换为字符串也解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 2016-03-07
  • 2021-09-18
  • 2016-02-19
  • 2015-09-28
  • 1970-01-01
  • 2013-10-25
  • 2011-06-13
相关资源
最近更新 更多