2010-07-07 13 views
14

मैं अपनी साइट के लिए लॉगिन का एहसास करना चाहता हूं। मैंने मूल रूप से Django बुक से निम्नलिखित बिट्स की प्रतिलिपि बनाई और चिपकाया। हालांकि मुझे अभी भी एक त्रुटि मिल रही है (सीएसआरएफ सत्यापन विफल रहा। अनुरोध निरस्त कर दिया गया।), मेरे पंजीकरण फॉर्म जमा करते समय। क्या कोई मुझे बता सकता है कि इस त्रुटि को किसने उठाया और इसे कैसे ठीक किया जाए?dsango में csrf त्रुटि

यहाँ मेरी कोड है:

views.py:

# Create your views here. 
from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from django.http import HttpResponseRedirect 
from django.shortcuts import render_to_response 

def register(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      return HttpResponseRedirect("/books/") 
    else: 
     form = UserCreationForm() 
    return render_to_response("registration/register.html", { 
     'form': form, 
    }) 

register.html:

<html> 
<body> 

{% block title %}Create an account{% endblock %} 

{% block content %} 
    <h1>Create an account</h1> 

    <form action="" method="post">{% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" value="Create the account"> 
    </form> 
{% endblock %} 
</body> 
</html> 

उत्तर

17

मुझे एक ही समस्या थी - और ब्लू मिर्च के जवाब ने मुझे सही रास्ते पर पहुंचाया। अपने फॉर्म व्यू में RequestContext जोड़ना समस्या को हल करता है।

from django.template import RequestContext 

और:

def register(request): 
if request.method == 'POST': 
    form = UserCreationForm(request.POST) 
    if form.is_valid(): 
     new_user = form.save() 
     return HttpResponseRedirect("/books/") 
else: 
    form = UserCreationForm() 
c = {'form': form} 
return render_to_response("registration/register.html", c, context_instance=RequestContext(request)) 

यह मेरे लिए यह तय हो गई।

+1

वर्तमान django के साथ, बेहतर समाधान render_to_response() के बजाय रेंडर() का उपयोग करना होगा। –

1

आप अपने संदर्भ के लिए csrf(request) जोड़ने की जरूरत है।

from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from django.http import HttpResponseRedirect 
from django.shortcuts import render_to_response 
from django.core.context_processors import csrf 

def register(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      return HttpResponseRedirect("/books/") 
    else: 
     form = UserCreationForm() 
    con = {'form': form} 
    con.update(csrf(request)) 
    return render_to_response("registration/register.html", con) 

आप इस के लिए एक Context वस्तु है, न कि dict में अपने संदर्भ चालू करने के लिए आवश्यकता हो सकती है, लेकिन सिद्धांत ध्वनि है।

5

मान लिया जाये कि आप Django 1.2.x पर हैं, बस {{form.as_p}} से पहले इस जोड़ें:

{% csrf_token %}

और क्यों समझने के लिए, बाहर की जाँच CSRF docs

+0

कर कि मेरे लिए पर्याप्त नहीं था के बजाय का उपयोग कर सकते हैं; उपयोगकर्ता 433033 समाधान अपेक्षित – Foon

1

सेटिंग्स फाइल करने के लिए इन 2 middlewares जोड़े यदि आप प्रत्येक फॉर्म में {% csrf_token %} जोड़ना नहीं चाहते हैं।

MIDDLEWARE_CLASSES = (
    #... 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.middleware.csrf.CsrfResponseMiddleware', 
) 
+0

उपर्युक्त Django 1.1 के लिए काम करेगा, लेकिन 1.2 –

+1

@stevejalim विडंबनात्मक रूप से नहीं, [docs] (http://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method) सुझाव यह अभी भी 1.2 के लिए काम करेगा लेकिन यह बहिष्कृत है। –

+0

आह आप सही हैं! –

8

मैं Django 1.2.3 उपयोग कर रहा हूँ, मैं कुछ रुक-रुक कर समस्या नहीं थी:

चीज़ें:

सुनिश्चित CSRF टोकन अपने टेम्पलेट में मौजूद है:

<form action="" method="post">{% csrf_token %} 

एक अनुरोध कॉन्टेक्स्ट का उपयोग करें:

return render_to_response('search-results.html', {'results' : results}, context_instance=RequestContext(request)) 

सुनिश्चित करें कि आप जीईटी के लिए अनुरोध कॉन्टेक्स्ट का भी उपयोग करते हैं, अगर उन्हें एक ही दृश्य फ़ंक्शन द्वारा संभाला जाता है, और उसी टेम्पलेट को प्रस्तुत किया जाता है।

यानी:

if request.method == 'GET': 
    ... 
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request)) 
elif request.method == 'POST': 
    ... 
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request)) 
नहीं

:

if request.method == 'GET': 
    ... 
    return render_to_response('search-results.html', {'results':results}) 
elif request.method == 'POST': 
    ... 
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request)) 

'सुनिश्चित Django।middleware.csrf.CsrfViewMiddleware 'अपने settings.py

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

बाद में जवाब में सूचीबद्ध है।

अब rendercontext_instance=RequestContext(request)

from django.shortcuts import render 
return render(request, "registration/register.html", { 
     'form': form, 
    }) 
संबंधित मुद्दे