向django表单中添加自定义复选框

向django表单中添加自定义复选框,django,forms,Django,Forms,我正在构建一个工具,当用户通过标准表单提交新对象时,它会执行一些基本检查 如果存在具有类似名称的项,则表单将被拒绝,并要求用户查看现有对象并确认他们想要创建新对象 现在,下面的警告复选框只需要在已经存在对象且从未存储该值的情况下显示。所以它不是模型的一部分,所以我将它添加到下面的表单模板中: <form action="/createItem/" method="post"> {% if similarObjects %} <div class="message

我正在构建一个工具,当用户通过标准表单提交新对象时,它会执行一些基本检查

如果存在具有类似名称的项,则表单将被拒绝,并要求用户查看现有对象并确认他们想要创建新对象

现在,下面的警告复选框只需要在已经存在对象且从未存储该值的情况下显示。所以它不是模型的一部分,所以我将它添加到下面的表单模板中:

<form action="/createItem/" method="post">
    {% if similarObjects %}
    <div class="message warning">
        <strong>The following public objects were found with a title similar to "<em>{{form.name.value}}</em>".
        </strong>
        <ul>
            {% for obj in similarObjects %}
            <li>{{ obj.name }}</li>
            {% endfor %}
        </ul>
        <input type="checkbox" name="userSwearsTheyKnowWhatTheyAreDoing"/>
        <label for="userSwearsTheyKnowWhatTheyAreDoing">
            I've reviewed these items, and none of them meet my needs. Make me a new one.
        </label>
    </div>
    {% endif %}

    {{ form.as_p }}

    <input type="submit" value="Submit" />
</form>
并获取错误:

KeyError at /create/objectclass/
'userSwearsTheyKnowWhatTheyAreDoing'

我做错了什么?

Django表单不会由您在模板中所做的任何操作来创建和定义。相反,您必须使用pyton定义表单,方法如下

class MyForm(forms.Form):
    userSwearsTheyKnowWhatTheyAreDoing = forms.BooleanField()
    ...

所以至少你需要把它加进去。这正是错误消息告诉您的。

您需要向ModelForm添加一个字段,然后在forms.py中有:

class MyForm(forms.ModelForm):
   userSwearsTheyKnowWhatTheyAreDoing = forms.BooleanField()

   class Meta:
      model = MyObject
在your views.py中:

...
myform = MyForm(request.POST)
if len(similar) == 0 or myform.cleaned_data['userSwearsTheyKnowWhatTheyAreDoing']:
   newObj = myforms.save() 
   messages.success(request,"New Object Saved")
   return HttpResponseRedirect('/object/%d'% newObj.pk) # Redirect after POST
...

@乐高冲锋队。。。我的回答能解决你的问题吗?
...
myform = MyForm(request.POST)
if len(similar) == 0 or myform.cleaned_data['userSwearsTheyKnowWhatTheyAreDoing']:
   newObj = myforms.save() 
   messages.success(request,"New Object Saved")
   return HttpResponseRedirect('/object/%d'% newObj.pk) # Redirect after POST
...