Estoy tratando de escribir una página web que permita al usuario ingresar una "Idea" y guardarla en la base de datos. Quiero usar el método Post del formulario. Intenté seguir las instrucciones en la página django, pero la autenticación aún falla.

Este es mi código de formulario:

<form action="/" method="post">
   {% csrf_token %} 
   <p> Title: </p>  <input type="text" name="title"> </br>  
   <p> Details: </p> <input type="text" name="details"> 
   <input type="submit" value="Post"> 
</form>

Mi URLconf redirige / a Ideas.views.home con la línea

url(r'^$', 'Ideas.views.home' , name='home')

La vista en sí es

from django.shortcuts import render, render_to_response
from django.http import HttpResponse
from django.template import loader, Template, Context, RequestContext   
from django.core.context_processors import csrf 
from Ideas.models import Idea 


# Create your views here.
def home(request):
    if request.method == 'POST': 
        submitted = Idea.objects.create(title=request.POST['title'], detail=request.POST['details'], votes=0) 
        submitted.save()
    m = RequestContext(request, {"passed_ideas": Idea.objects.all()})
    return render_to_response('basic.html', m)  

También he intentado hacer esto:

from django.shortcuts import render, render_to_response
from django.http import HttpResponse
from django.template import loader, Template, Context, RequestContext   
from django.core.context_processors import csrf 
from Ideas.models import Idea 


# Create your views here.
def home(request):
    c = {} 
    c.update(csrf(request)) 
    if request.method == 'POST': 
        submitted = Idea.objects.create(title=request.POST['title'], detail=request.POST['details'], votes=0) 
        submitted.save()
    c['passed_ideas'] = Idea.objects.all()
    return render_to_response('basic.html', c)  

¿Cómo hago para que funcione la autenticación CSRF?

0
elder4222 27 ago. 2014 a las 22:35

4 respuestas

La mejor respuesta

Sí, tiene que usar render, o debe agregar crsf al render para responder de la siguiente manera:

render_to_response('basic.html', add_csrf(request, ***other context***))


from django.core.context_processors import csrf
def add_csrf(request, ** kwargs):
   """Add CSRF and user to dictionary."""
   d = dict(user=request.user, ** kwargs)
   d.update(csrf(request))
   return d

No es que me guste esta opción, pero así es como lo hice. Creo que RequestContext es una mejor opción.

0
gabn88 29 ago. 2014 a las 16:51

Creo que necesita agregar context_instance=RequestContext(request) cuando renderiza su plantilla para procesar su token csrf

 return render_to_response('basic.html', c, context_instance=RequestContext(request))  
0
klasske 27 ago. 2014 a las 18:45

Tuve un problema similar hace unas semanas. Parece que redirigir a la url con '/' hace que suelte el token CSRF. Si ese es el problema, agregue trailing_slash = False a su enrutador:

# urls.py
router = DefaultRouter(trailing_slash=False)

urlpatterns = patterns('', 
    url(r'^$', views.IndexView.as_view(), name='home'),
    #all of your urls go here
)

Esto eliminará la redirección y el token CSRF debería aparecer.

0
Chris Belyeu 27 ago. 2014 a las 18:51

Gracias a todos los que ayudaron, pero cambian de

return render_to_response(...) 

Para

return render(request, ...) 

Finalmente lo arreglé

0
elder4222 27 ago. 2014 a las 19:15