【问题标题】:Getting Django CSRF error with raw html form使用原始 html 表单获取 Django CSRF 错误
【发布时间】:2019-10-04 04:28:23
【问题描述】:

我正在尝试设置一个原始 html 表单,用户可以在其中提出建议,然后使用 POST 方法将其保存在数据库中,但即使按照“帮助”部分中的步骤操作,我仍然收到Forbidden (403) CSRF verification failed. Request aborted. .

我发现如果像这样在视图顶部添加csrf_exempt,我不会收到错误消息:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def suggest_ptags(request):
    context = {}
    print("Form is submitted.")
    return render(request, "partials/search_form.html", context)

但我知道它完全删除了 CSRF 保护,我不希望这样。

那我该怎么办?

这是我在模板中的部分文件夹中的 search_form.html 表单:

<!-- Suggestion Form in popup -->
    <div class="prop-modal">
        <div class="prop-content">

            <a class="btn-close-prop">&times;</a>
            <img src="{% static 'images/pyramids.svg' %}">

            <form action="/suggest_ptags/" class="feedback-form" method="POST" enctype="text/plain">
            {% csrf_token %}
                    <h5 class="title-prop">Suggestion</h5>
                    <input class="input-prop" name="suggest" rows="3" cols="37" placeholder="suggest something..."></input>
                    <input class="button-prop" type="submit" value="Envoyez"></input>
            </form>

        </div>
    </div>

我当前的 Views.py:

from django.views.decorators.csrf import ensure_csrf_cookie


@ensure_csrf_cookie
def suggest_ptags(request):
    context = {}
    print("Form is submitted.")
    return render(request, "partials/search_form.html", context)

在我的网址中:

from django.conf.urls import url
from django.contrib import admin
from search.views import HomeView, ProductView, FacetedSearchView, autocomplete, suggest_ptags
from .settings import MEDIA_ROOT, MEDIA_URL
from django.conf.urls.static import static

urlpatterns = [
    url(r'^$', HomeView.as_view(), name='home'),
    url(r'^admin/', admin.site.urls),
    url(r'^suggest_ptags/$', suggest_ptags, name='suggest_ptags'), #Suggestions
    url(r'^product/(?P<slug>[\w-]+)/$', ProductView.as_view(), name='product'),
    url(r'^search/autocomplete/$', autocomplete),
    url(r'^search/', FacetedSearchView.as_view(), name='haystack_search'),

] + static(MEDIA_URL, document_root=MEDIA_ROOT)

有什么解决办法吗?

【问题讨论】:

  • 呈现表单的视图在哪里?
  • 我没有,我的 search_form.html 是一个 django 表单,所以每次我在 html 文件中需要这个表单时,我都会传递模板标签来包含表单。
  • 我在需要表单的 html 文件顶部添加了类似这样的内容:{% extends "layout.html" %} {% block title %} "{{ query }}" | {{ block.super }} {% endblock %} {% load staticfiles %} {% block content %} {% endblock %}

标签: html django django-views csrf


【解决方案1】:

您不应该使用enctype="text/plain"。您可以删除它(与enctype="multipart/form-data" 相同),或者如果您正在上传文件,则使用enctype="multipart/form-data"

【讨论】:

  • 非常感谢!这解决了这个问题。我花了一整天才发现是这个小东西!坚持总有回报!!
猜你喜欢
  • 2013-06-11
  • 1970-01-01
  • 2016-08-16
  • 2017-07-19
  • 2013-07-13
  • 1970-01-01
  • 2021-02-13
  • 2016-06-22
  • 2015-12-23
相关资源
最近更新 更多