Tôi đã đọc Django - CSRF verification failed và một số câu hỏi (và câu trả lời) liên quan đến phương thức django và POST. Một trong những best-nhưng-không-làm việc-cho-tôi trả lời là https://stackoverflow.com/a/4707639/755319Phương thức POST luôn trả về 403 Forbidden
Tất cả các câu trả lời chấp thuận đề nghị ít nhất 3 điều:
- Sử dụng RequestContext như tham số thứ ba của render_to_response_call
- Add {% csrf_token%} trong mọi hình thức với phương thức POST
- Kiểm tra MIDDLEWARE_CLASSES trong settings.py
tôi đã thực hiện đúng như đề nghị, nhưng lỗi vẫn xuất hiện. Tôi sử dụng django 1.3.1 (từ ubuntu 12.04 kho) và python 2.7 (mặc định từ ubuntu)
này Xem của tôi:
# Create your views here.
from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from models import BookModel
def index(request):
return HttpResponse('Welcome to the library')
def search_form(request):
return render_to_response('library/search_form.html')
def search(request):
if request.method=='POST':
if 'q' in request.POST:
q=request.POST['q']
bookModel = BookModel.objects.filter(title__icontains=q)
result = {'books' : bookModel,}
return render_to_response('library/search.html', result, context_instance=RequestContext(request))
else:
return search_form(request)
else:
return search_form(request)
và đây là mẫu của tôi (search_form.html):
{% extends "base.html" %}
{% block content %}
<form action="/library/search/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
{% endblock %}
Tôi đã khởi động lại máy chủ, nhưng lỗi 403 bị cấm vẫn còn đó, cho biết xác minh CSRF không thành công.
Tôi đã 2 câu hỏi:
- Làm thế nào để khắc phục lỗi này?
- Tại sao rất khó để tạo một "POST" trong django, ý tôi là có lý do cụ thể nào để làm cho nó quá chi tiết (tôi đến từ PHP và chưa bao giờ tìm thấy vấn đề như vậy trước đây)?
Đó của công trình, cảm ơn bạn đã trả lời của bạn. Nhưng làm thế nào và tại sao? Bạn có thể xin giải thích? – goFrendiAsgard
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it - đọc điểm # 3 – zubinmehta
Bởi vì 'csrf_token' phải được tạo trong chế độ xem của bạn để django có thể vượt qua nó vào mẫu. Trong trường hợp của bạn, vì chế độ xem tìm kiếm của bạn không tạo mã thông báo, '{% csrf_token%}' trong mẫu của bạn là 'chuỗi rỗng (Không)' và trang kết quả không thành công trên xác minh – FallenAngel