2017-01-12 58 views
5

Próbuję prosty formularz rejestracyjny użytkownika w Django. CSRF żeton nie jest uzyskiwanie generowane podczas korzystania render_to_responseDjango - Generowanie tokenów CSRF - render_to_response vs renderowanie

powrót render_to_response ('Rejestracja/register.html', RequestContext (request, { 'form': RegistrationForm()}))

gdzie jako , CSRF znacznik jest uzyskiwanie generowane podczas korzystania render

powrotu czyni (żądanie, 'rejestracja/register.html', { 'forma' RegistrationForm()})

robię nic złego render_to_response

Poniżej odpowiedni blok kodu

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 %} 

Odpowiedz

8

Zalecanym sposobem jest użycie render zamiast render_to_response . Kod jest prostszy, a token CSRF będzie działał, ponieważ render użyje kontekstu żądania do renderowania szablonu.

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

The docs recommend that you don't use render_to_response. Przed Django 1.10 można ręcznie przekazać RequestContext jako trzeci argument, ale nie jest to możliwe w Django 1.10+. Używasz RequestContext jako drugiego argumentu, który jest nieprawidłowy - drugi argument powinien być zwykłym słownikiem.

Pamiętaj też, że nie zwracasz odpowiedzi, gdy formularz jest nieprawidłowy. Możesz to naprawić, nieznacznie dostosowując kod:

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})