Vous n'êtes pas identifié(e).
Bonjour,
Voila depuis quelque temps je me suis mit à Python et plus particulièrement au framework Django, tout ce déroule plus ou moins bien jusqu'à ce que je tombe lors d'un test de formulaire, qu'il y a ces fameux crsf token, et la problématique c'est que je n'arrive pas à les faire fonctionner, je me suis pourtant penché sur la doc du site officielle de django, et j'ai essayé de reproduire en essayant d'adapté ces derniers, mais à chaque fois c'est la même rengaine comme quoi je n'ai pas activé les crsf token.
Je viens donc vous voir dans l'espoir de trouver de l'aide .
forms.py:
from django import forms
class LoginForm(forms.Form):
Pseudo = forms.CharField(label='Pseudonyme')
mdp = forms.CharField(label='Mot de passe', widget=forms.PasswordInput)
email = forms.EmailField(label='Mail')
login.html:
{% extends "base.html" %}
{% block contenu %}
<form action="login" method="post">{% csrf_token %}
{{ form.as_p }}
<p>
<input type="submit" value="Envoyer"/>
<a href="????">Créer un compte</a>
</p>
</form>
{% endblock %}
et enfin mon views.py:
from django.shortcuts import render_to_response
from val.forms import LoginForm
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
def accueil(request):
return render_to_response('accueil.html')
def login(request):
form = LoginForm()
return render_to_response('login.html',{'form':form})
def valid_form(request):
c = {}
c.update(csrf(request))
if request.method == 'POST':
form1 = LoginForm(request.POST)
if form1.is_valid():
return HttpResponseRedirect('/accueil/')
else:
form1 = LoginForm()
return render_to_response('login.html', {'form1', form1})
Je vous remercie d'avance.
PS: J'ai bien ajouté la ligne dans les MIDDLEWARE.
Hors ligne
Salut,
Le problème vient de la vue valid_form qui ne retourne qu'un formulaire dans le context. Il faut que le context contienne également le token comme indiqué ici : Cross Site Request Forgery protection.
++
Dernière modification par Jaals (07-07-2014 08:58:47)
Hors ligne
Merci, mais je suis pas sur de bien tout saisir, en somme je comprends pas trop ce qu'est le "context" je l'ai bien vu sur le site, mais je ne suis pas sur d'avoir compris ce que c'est, je débute vraiment là dedans donc j'ai encore beaucoup de lacunes ^^'.
Merci encore ^^.
Hors ligne
Le context est un dictionnaire qui permet de passer des données au template.
Dans la vue, il est créé ainsi :
c = {}
c.update(csrf(request))
Auquel tu as besoin d'ajouter le formulaire :
c['form1'] = form1
Au final, la vue valid_form devrait ressembler à ça :
def valid_form(request):
c = {}
c.update(csrf(request))
if request.method == 'POST':
form1 = LoginForm(request.POST)
if form1.is_valid():
return HttpResponseRedirect('/accueil/')
else:
form1 = LoginForm()
c['form1'] = form1
return render_to_response('login.html', c)
Hors ligne
D'accoooord merci de l'explication c'est beaucoup plus clair comme ça
Je viens d'essayer et il me met toujours l'erreur 403
Hors ligne
essaye return render_to_response('login.html', locals())
Hors ligne
Deux choses:
1) n'utilisez plus render_to_response. Utilisez render à la place (https://docs.djangoproject.com/en/1.6/t … ts/#render).
Cela évitera les cas dans lesquels le RequestContext est oublié (ce qui implique que le token csrf n'est pas passé au template entre autre choses).
2) NE JAMAIS PASSER locals() au context. C'est une mauvaise pratique parce que l'intégralité du contexte de la fonction est passé au template et on préfère l'éviter.
Hors ligne