我在django中有以下表单
forms.py
class CtForm(ModelForm):
class Meta:
model = Contact
fields = ["name", "email"]
# widgets = {'cid': HiddenInput()}
models.py
class Contact(models.Model):
cid = models.ForeignKey(Cr, on_delete=models.CASCADE)
name = models.CharField(max_length=255, null=False)
email = models.EmailField(max_length=255, null=False)
字符串
我有一个模板中显示的形式,一切都显示良好,没有问题,问题是当我提交表单,我得到以下错误:
(Hidden field cid) This field is required.
型
但如果我把
widgets = {'cid': HiddenInput()}
型
从forms.py它的作品完美,任何方法,使这一工作,而不显示在模板中的CID?
views.py
def create_contact(request, cid):
cr = cr.objects.get(id=cid)
if request.method == 'POST':
form = CtForm(request.POST)
if form.is_valid():
form.instance.cid_id = cid
form.save()
return render(request, 'create_contact.html', {
'form': form,
'cr': cr,
})
else:
form = CtForm(None)
return render(request, 'create_contact.html', {
'form': form,
'cr': cr,
})
型
正在使用的模板代码
<form method="post" action="" novalidate>
{% csrf_token %}
<tbody>
{{ form.as_table }}
<td><input type="submit" value="Create"> </td>
</tbody>
</form>
型
1条答案
按热度按时间qij5mzcb1#
没有必要在表单中包含
cid
,它已经在URL中了。因此我们可以从表单中排除它:字符串
在视图中,我们注入
cid
,所以:型
备注:通常使用**
get_object_or_404(…)
[Django-doc]比直接使用.get(…)
[Django-doc]更好。如果对象不存在,例如因为用户自己更改了URL,get_object_or_404(…)
将导致返回 HTTP 404 Not Found 响应,而使用.get(…)
将导致 HTTP 500 Server Error。备注:虽然大多数表单都不处理媒体文件,但最好还是将
request.FILES
[Django-doc]传递给表单,这样,如果您稍后添加额外的媒体字段,所有使用表单的视图都将正确处理文件。备注:如果POST请求成功,你应该做一个
redirect
**[Django-doc]来实现Post/Redirect/Get pattern [wiki]。这样可以避免当用户刷新浏览器时你做同样的POST请求。