2017-05-13 2 views
0

Quand je suis en train d'enregistrer, je reçois une erreur:django csrf_token manquant Erreur

Forbidden (403) CSRF verification failed. Request aborted.

Mon code:

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST, request.FILES) 
     if form.is_valid(): 
      first_name = form.cleaned_data.get("firstname") 
      last_name = form.cleaned_data.get("lastname") 
      username = form.cleaned_data.get("username") 
      password = form.cleaned_data.get("password") 
      user = User.objects.create_user(username=username,password=password) 
      user.first_name = first_name 
      user.last_name = last_name 
      user.set_password(password) 
      user.is_active = True 
      user.save() 
      return HttpResponseRedirect('/home/') 
    else: 
     form = RegistrationForm() 
    return render_to_response('registration/registerHome.html',dict(form=form, 
     context_instance=RequestContext(request))) 

mon form.py

class RegistrationForm(forms.Form): 
    """ 
    A registration form to create normal user. 
    """ 
    firstname = forms.RegexField(regex=r'^\[a-zA-Z]+$', 
     widget=forms.TextInput(attrs={ 'required':True, 
      'max_length':30, 
      'autocomplete':'off', 
      'class':'form-control input-sm', 
      'placeholder':'First Name' }), 
     error_messages={ 'invalid': _("Only alphabets are allowed.") } 
     ) 
    lastname = forms.RegexField(regex=r'^\[a-zA-Z]+$', 
     widget=forms.TextInput(attrs={ 'required':True, 
      'max_length':30, 
      'autocomplete':'off', 
      'class':'form-control input-sm', 
      'placeholder':'Last Name' }), 
     error_messages={ 'invalid': _("Only alphabets are allowed.") } 
     ) 
    username = forms.RegexField(regex=r'^\w+$', 
     widget=forms.TextInput(attrs={'required':True, 
      'max_length':30, 
      'autocomplete':'off', 
      'class':'form-control input-sm', 
      'placeholder':'username'}), 
     error_messages={ 'invalid': _("Only [a-z A-Z 0-9 _] are allowed.") } 
     ) 
    password = forms.CharField(widget=forms.PasswordInput(attrs={ 
      'required':True, 
      'max_length':30, 
      'autocomplete':'off', 
      'class':'form-control input-sm', 
      'placeholder':'password', 
      'render_value':False }) 
      ) 

    def clean_username(self): 
     try: 
      user = User.objects.get(username__iexact=self.cleaned_data['username']) 
     except User.DoesNotExist: 
      return self.cleaned_data['username'] 
     raise forms.ValidationError(_("Username already exists.")) 

    class Meta: 
     model = User 

ma template.html

<form action="." method="post" role="form" id="register-form"> 
          {% csrf_token %} 
          {{ form.as_p }} 
          <input type="submit" value="submit" /> 
         </form> 

Quelqu'un, s'il vous plaît aidez-moi, pourquoi je reçois une erreur. J'essaye de résoudre ce problème pendant 1 semaine et obtenant toujours l'erreur. Aidez-moi, s'il vous plaît.

+0

Êtes-vous sûr que le CsrfViewMiddleware est ajouté dans les paramètres fichier? – dentemm

+0

Oui. 'django.middleware.csrf.CsrfViewMiddleware', dans setting.py – ecoder

Répondre

1

Vous devez utiliser render et ajouter else

Ensuite, faites comme

def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST, request.FILES) 
     if form.is_valid(): 
      first_name = form.cleaned_data.get("firstname") 
      last_name = form.cleaned_data.get("lastname") 
      username = form.cleaned_data.get("username") 
      password = form.cleaned_data.get("password") 
      user = User.objects.create_user(username=username,password=password) 
      user.first_name = first_name 
      user.last_name = last_name 
      user.set_password(password) 
      user.is_active = True 
      user.save() 
      return HttpResponseRedirect('/home/') 
     else: 
      return render(request, 'registration/registerHome.html',dict(form=form))) 
    else: 
     form = RegistrationForm() 
    return render(request, 'registration/registerHome.html',dict(form=form))) 
+0

J'ai essayé. Mais maintenant form.is_valid() ne fonctionne pas. Je veux dire, form = RegistrationForm (request.POST) si form.is_valid(): non vrai. – ecoder

+0

ne fonctionne pas? toute erreur ou si elle renvoie False, essayez d'imprimer 'form.errors' dans d'autres conditions. – itzMEonTV

+0

erreur statique: RegistrationFrom n'a aucune erreur d'attribut. Je veux dire, from.error a l'erreur. – ecoder

0

Essayez quelque chose comme ceci. Je me souviens il y a quelque temps j'ai eu le même problème et en déclarant le c dictionnaire et en le passant au render_to_response résolu mon problème.

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     # do your post stuff here 
     pass 
    else: 
     c = {} 
     c['form'] = RegistrationForm() 
     c['context_instance'] = RequestContext(request) 
     return render_to_response('registration/registerHome.html',c) 
+0

Obtention de la même erreur. – ecoder

0

Essayez d'utiliser https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/#render

from django.shortcuts import render 
@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST, request.FILES) 
     if form.is_valid(): 
      first_name = form.cleaned_data.get("firstname") 
      last_name = form.cleaned_data.get("lastname") 
      username = form.cleaned_data.get("username") 
      password = form.cleaned_data.get("password") 
      user = User.objects.create_user(username=username,password=password) 
      user.first_name = first_name 
      user.last_name = last_name 
      user.set_password(password) 
      user.is_active = True 
      user.save() 
      return HttpResponseRedirect('/home/') 
    else: 
     form = RegistrationForm() 
    return render(request, 'registration/registerHome.html',dict(form=form))) 
+0

L'erreur a disparu mais pas l'utilisateur. – ecoder

+0

Pourrait être une erreur dans le formulaire et ne pas afficher dans le modèle. Essayez d'imprimer l'erreur après autre bloc i.e 'print form.errors' – psorab

+0

ouais. Maintenant ça marche. Merci :) – ecoder

0

Vous n'avez pas besoin d'utiliser le décorateur @csrf_protect tant que le middleware CSRF est ajoutée.Procédé Middleware vous donne une couverture de protection sur toutes les vues - ajouter le décorateur est redondant. Les docs Django recommandent d'utiliser l'intergiciel sur le décorateur car il offre une meilleure protection.

Essayez après avoir enlevé le décorateur.

+0

J'ai essayé mais il n'y a pas d'amélioration. – ecoder