通过 Django 将表单 POST 到数据库不保存数据
Posted
技术标签:
【中文标题】通过 Django 将表单 POST 到数据库不保存数据【英文标题】:Form POST to database via Django doesn't save data 【发布时间】:2021-10-04 15:51:06 【问题描述】:按照 Django 教程,我编写了以下 html 文件,该文件采用用户填写的表单并将其作为对象添加到数据库中(表单是类的一堆属性)
% block content %
<form>
<form method="POST"> % csrf_token %
form.as_p
<input type='submit' value = 'save' />
</form>
% endblock %
它没有将表单保存到数据库中,而是在 url 中添加了一个奇怪的字符串(粘贴在下面)。
这发生在教程中的那个人身上,但在他添加了<form method="POST"> % csrf_token %
后它被修复了
这是什么“错误”,我该如何处理?还有,如果以后发生了怎么办?
没有真正的错误,服务器运行良好,因此没有要显示的回溯/错误消息。我确保form.as_p
是一个真实变量,并且与教程相关的变量或标签中没有拼写错误。我能想到的唯一问题是版本的变化——教程在 Django 2.0.7 中,我在 3.2.5 中,但根据我在文档中看到的内容,csrf_token
仍然有效。
添加到下面的网址。如果只是表单的值(asd,asd,1),我知道结尾,但是其余的是什么,我该怎么做才能解决它?
?csrfmiddlewaretoken=KWR2kXFqa3k1ETQsuyhKmHN6cJvZfj72KHkw1v4aGYTdThW9S7zWylCFJpNjhVDB&title=asd&description=asd&price=1
谢谢!
编辑:
forms.py:
from django import forms
from .models import product
class ProductForm(forms.ModelForm):
class Meta:
model = product
fields = ['title','description','price']
views.py:
def product_create_view(request):
form = ProductForm(request.POST or None)
if form.is_valid():
form.save()
context =
'form': form
return render (request, 'product/product_create.html', context)
另外:从代码中删除了% csrf_token %
,它仍然没有工作。它只是将表单输入放在 url 中并没有保存它。
【问题讨论】:
请提供forms.py
和views.py
的代码。
csrf afaik 永远不会放在 URL 中。也许您正在查看表单数据?
【参考方案1】:
您的表单有错误的额外标签
% block content %
<form> <!-- Remove this -->
<form method="POST"> % csrf_token %
form.as_p
<input type='submit' value = 'save' />
</form>
% endblock %
这使您的表单使用默认方法(即 GET,而不是 POST),因此您的数据被添加到 URL 中。 CSRF 只不过是表单中的一个额外字段,这就是它在 url 中的原因
【讨论】:
【参考方案2】:首先改变你的看法
def product_create_view(request):
if request.method == 'POST'
form = ProductForm(request.POST)
if form.is_valid():
form.save()
else:
form = ProductForm()
return render (request, 'product/product_create.html', 'form': form)
然后在你的html中
% block content %
<form method="POST"> % csrf_token %
form.as_p
<input type='submit' value = 'save' />
</form>
% endblock %
【讨论】:
以上是关于通过 Django 将表单 POST 到数据库不保存数据的主要内容,如果未能解决你的问题,请参考以下文章
将表单添加到 Django DetailView 错误消息:不允许的方法(POST)