2012-03-07 11 views
12

Sau đây là đoạn có liên quan của HTML trong template:Django CSRF thẻ sẽ không hiển thị

<form action="/submit_text/" method="post"> 
    {% csrf_token %} 
    {% include "backbone/form_errors.html" %} 
    {{form.as_p}} 
    <input type="submit" value="Submit" /> 
    </form> 

Đây là tôi settings.pyMIDDLEWARE_CLASSES khai:

MIDDLEWARE_CLASSES = ( 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

Các CSRF dấu hiệu chỉ đơn giản là không hiển thị, gây ra một

Bị cấm (403) xác minh CSRF không thành công. Yêu cầu bị hủy.

Trả lời

21

Bạn cần phải vượt qua RequestContext trong render_to_response để các bộ xử lý ngữ cảnh thực sự được chạy.

from django.template import RequestContext 

context = {} 
return render_to_response('my_template.html', 
          context, 
          context_instance=RequestContext(request)) 

các render shortcut mới (django 1.3+) sẽ làm điều đó cho bạn:

from django.shortcuts import render 

context = {} 
return render(request, 'my_template.html', context) 
+0

Cảm ơn bạn, điều đó hoạt động! – babonk

+1

Rất hữu ích! Tôi đã có một thẻ mẫu tùy chỉnh, vì vậy tôi đã phải chỉ định '@ register.simple_tag (takes_context = True)' và sau đó 'return render_to_string ('template.html', {}, context_instance = context)'. – osa

5

Trong khi có một câu trả lời kiểm tra, tôi muốn chỉ ra rằng viết context_instance.... được thực sự gây phiền nhiễu. Tôi thấy điều này hữu ích ... đặc biệt là với forms

context.update(csrf(request)) 
+0

cảm ơn về mẹo – babonk