2017-01-12 3 views
5

Я пробовал простую регистрационную форму пользователя в Django. CSRF маркер не получает генерируется, когда я использую render_to_responseDjango - Генерация токенов CSRF - render_to_response vs render

возврата render_to_response ('регистрации/register.html', RequestContext (запрос, { 'форма': RegistrationForm()}))

где, как , CSRF маркер становится генерируется, когда я использую render

возврата визуализации (запрос, 'регистрации/register.html', { 'форма': RegistrationForm()})

я делаю что-то неправильно с render_to_response

Ниже соответствующий блок кода

views.py

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      user = User.objects.create_user(
       username=form.cleaned_data['username'], 
       password=form.cleaned_data['password1'], 
       email=form.cleaned_data['email'] 
      ) 
      return HttpResponseRedirect('/register_success/') 
    else: 
     return render_to_response('registration/register.html', RequestContext(request, {'form': RegistrationForm()})) 

register.html

{% extends "base.html" %} 
{% block title %}User Registration{% endblock %} 

{% block content %} 
    <form method="post" action="."> 
     {% csrf_token %} 
     <table border="0"> 
      {{ form.as_table }} 
     </table> 
     <input type="submit" value="Register" /> 
    </form> 
{% endblock %} 

ответ

8

Рекомендуемый подход заключается в использовании render вместо render_to_response , Код проще, и токен CSRF будет работать, потому что render будет использовать контекст запроса для визуализации шаблона.

return render(request, 'registration/register.html', {'form': RegistrationForm()}) 

The docs recommend that you don't use render_to_response. Перед Django 1.10 вы можете вручную передать RequestContext в качестве третьего аргумента, но это невозможно в Django 1.10+. Вы используете RequestContext как второй аргумент, который является неправильным - вторым аргументом должен быть обычный словарь.

Наконец, обратите внимание, что вы не возвращаете ответ, когда форма недействительна. Вы можете исправить это, слегка изменив код:

if request.method == 'POST': 
    form = RegistrationForm(request.POST) 
    if form.is_valid(): 
     ... 
     return HttpResponseRedirect('/register_success/') 
else: 
    form = RegistrationForm() 
return render(request, 'registration/register.html', {'form': form}) 
Смежные вопросы