通过 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 %}