【问题标题】:Form POST to database via Django doesn't save data通过 Django 将表单 POST 到数据库不保存数据
【发布时间】: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 中。也许您正在查看表单数据?

标签: python html django api-design


【解决方案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 %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多