2017-01-12 1 views
5

Ich probiere ein einfaches Benutzerregistrierungsformular in Django aus. CSRF-Token wird nicht immer erzeugt wird, wenn ich render_to_responseDjango - CSRF Token-Generierung - render_to_response vs render

Rückkehr render_to_response ('registration/register.html', Request (Anfrage, { 'Form': Registration()}))

wo als wird CSRF-Token erzeugt wurden, wenn ich render

Rückkehr machen verwenden (Antrag, 'registration/register.html', { 'Form': Registration()})

Bin ich nichts falsch machen mit render_to_response

wird nach dem entsprechenden Codeblock

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

Antwort

8

Der empfohlene Ansatz ist render statt render_to_response zu verwenden . Der Code ist einfacher und das CSRF-Token funktioniert, da render einen Anforderungskontext zum Rendern der Vorlage verwendet.

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

The docs recommend that you don't use render_to_response. Vor Django 1.10 konnten Sie manuell ein RequestContext als drittes Argument übergeben, aber dies ist in Django 1.10+ nicht möglich. Sie verwenden ein RequestContext als das zweite Argument, das falsch ist - das zweite Argument sollte ein normales Wörterbuch sein.

Beachten Sie schließlich, dass Sie keine Antwort zurückgeben, wenn das Formular ungültig ist. Sie können dies beheben, indem Sie Ihren Code leicht anpassen:

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