通过 Django 从 POST 到数据库的表单不保存数据
Form POST to database via Django doesn't save data
按照 Django 教程,我编写了以下 html 文件,该文件采用用户填写的表单并将其作为对象添加到数据库(表单是 class)
{% block content %}
<form>
<form method="POST"> {% csrf_token %}
{{ form.as_p }}
<input type='submit' value = 'save' />
</form>
{% endblock %}
它没有将表单保存到数据库,而是向 url 添加了一个奇怪的字符串(粘贴在下面)。
这发生在教程中的那个人身上,但在他添加 <form method="POST"> {% csrf_token %}
后修复了
这个“错误”是什么,我该如何处理?另外,以后遇到这种情况怎么办?
没有真正的错误,服务器运行正常,因此没有 traceback/error 消息显示。我确保 form.as_p
是一个真正的变量,并且在与教程相关的变量或标签中没有拼写错误。我唯一能想到的问题是版本的变化——教程是 Django 2.0.7,我是 3.2.5,但根据我在文档中看到的,csrf_token
仍然有效。
添加到下面的 url。如果只是表单的值(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 中并没有保存它。
您的表单有一个错误的额外标签
{% 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
中的原因
首先稍微改变一下看法
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 教程,我编写了以下 html 文件,该文件采用用户填写的表单并将其作为对象添加到数据库(表单是 class)
{% block content %}
<form>
<form method="POST"> {% csrf_token %}
{{ form.as_p }}
<input type='submit' value = 'save' />
</form>
{% endblock %}
它没有将表单保存到数据库,而是向 url 添加了一个奇怪的字符串(粘贴在下面)。
这发生在教程中的那个人身上,但在他添加 <form method="POST"> {% csrf_token %}
后修复了
这个“错误”是什么,我该如何处理?另外,以后遇到这种情况怎么办?
没有真正的错误,服务器运行正常,因此没有 traceback/error 消息显示。我确保 form.as_p
是一个真正的变量,并且在与教程相关的变量或标签中没有拼写错误。我唯一能想到的问题是版本的变化——教程是 Django 2.0.7,我是 3.2.5,但根据我在文档中看到的,csrf_token
仍然有效。
添加到下面的 url。如果只是表单的值(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 中并没有保存它。
您的表单有一个错误的额外标签
{% 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
中的原因首先稍微改变一下看法
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 %}