【发布时间】: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">×</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