通过 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 中添加了一个奇怪的字符串(粘贴在下面)。 这发生在教程中的那个人身上,但在他添加了&lt;form method="POST"&gt; % csrf_token % 后它被修复了 这是什么“错误”,我该如何处理?还有,如果以后发生了怎么办?

没有真正的错误,服务器运行良好,因此没有要显示的回溯/错误消息。我确保form.as_p 是一个真实变量,并且与教程相关的变量或标签中没有拼写错误。我能想到的唯一问题是版本的变化——教程在 Django 2.0.7 中,我在 3.2.5 中,但根据我在文档中看到的内容,csrf_token 仍然有效。

添加到下面的网址。如果只是表单的值(asd,asd,1),我知道结尾,但是其余的是什么,我该怎么做才能解决它? ?csrfmiddlewaretoken=KWR2kXFqa3k1ETQsuyhKmHN6cJvZfj72KHkw1v4aGYTdThW9S7zWylCFJpNjhVDB&amp;title=asd&amp;description=asd&amp;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.pyviews.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表格,POST

将表单添加到 Django DetailView 错误消息:不允许的方法(POST)

搭建简单Django服务并通过HttpRequester实现GET/POST请求提交表单

使用 Django 通过 post 传递值

django表单提交后如何用弹框提示成功?

Django没有将表单提交到数据库