2013-05-06 2 views
2

Я использую django 1.5.1, я должен использовать {% csrf_token%} для каждого POST для работы. RequestContext не работал для меня, вот мои настройки, просмотр код и код шаблона.ошибка маркера django csrf (RequestContext не работает)

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', 
) 

def show_rates(request, doc_id, template_name='rate.html'): 
    doc = get_object_or_404(Doctor, id=doc_id) 
    hos = doc.hospital 
    docts = hos.doctor_set.all() 
    page_title = doc.name 
    hos_name = hos.name 
    if request.method == "POST": 
     postdata = request.POST.copy() 
     form = AddToRateForm(postdata) 
    else: 
     form = AddToRateForm() 
    return render(request, template_name, locals()) 

<form method="POST" action="."> 
    {{ form.as_table }} 
    <div class="row-fluid"> 
     <div class="span10"> 
     </div> 
     <div class="span2"> 
      <button class="btn btn-block btn-primary" type="submit">Rate</button> 
     </div> 
    </div> 
</form> 

RequestContext не работает для меня. Я запутался.

+3

Как выглядит ваш шаблон? Вы помещали токен в номер

? Кроме того, использование локальных приложений классно, но оно принимает все переменные внутри представления и предоставляет их шаблону. Это может оказаться менее оптимальным, и поэтому вы должны поместить все, что хотите, из своего представления в словарь и отправить его в свой шаблон. –

+0

Что вы имеете в виду, не работали? Можете ли вы предоставить некоторые шаблоны и сказать, что не работает? – rjv

ответ

2

MIDDLEWARE_CLASSES вид хороший.

Это код, который вы должны использовать для csrf.

from django.shortcuts import render 
from django.views.decorators.csrf import csrf_exempt, csrf_protect 

@csrf_protect 
#@csrf_exempt says to make an exemption on csrf, but of course is not secure. 
#@csrf_exempt 
def show_rates(request, doc_id, template_name='rate.html'): 
    ... 
    #I suppose that locals() returns a dict() 
    return render(request, template_name, locals()) 


<form method="POST" action=""> 
    {# Don't forget the following line #} 
    {% csrf_token %} 
    {{ form.as_table }} 
    <div class="row-fluid"> 
     <div class="span10"> 
     </div> 
     <div class="span2"> 
      <button class="btn btn-block btn-primary" type="submit">Rate</button> 
     </div> 
    </div> 
</form> 
+0

есть ли способ что я могу избежать набирать {% csrf_token%} каждый раз, когда добавляю сообщение формы? – luthur

+0

Короткий ответ - нет, вы не можете. Вы должны поместить '{% csrf_token%}' в каждую форму, которую вы используете (! Только для внутренних URL-адресов!). Если у вас много форм, вы можете подумать о том, чтобы положить формы в шаблоны. Для получения дополнительной информации о 'csrf_token' проверьте документы https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it. – CodeArtist

+0

жаль, что раньше я использовал CsrfResponseMiddleware, и я не видел новый документ csrf, представленный в Django1.4 – luthur

0

Попробуйте изменить определение представления, чтобы добавить этот декоратор:

@csrf_protect 
def show_rates(request, doc_id, template_name='rate.html'): 

И обновить свой обратный ответ, чтобы не включать context_instance. На самом деле это не нужно.

return render_to_response(template_name, locals()) 
+0

все еще не работает ........ – luthur

+0

Я добавил свой код шаблона – luthur

+0

извините, что раньше использовал CsrfResponseMiddleware, и я не видел нового документа csrf, представленного в Django1.4. – luthur