2016-10-10 2 views
0

J'ai quelques formes que je veux valider avec une vue ajax.Comment ajaxable valider un PasswordChangeForm?

class ProfileEditPasswordForm(PasswordChangeForm): 
    class Meta: 
     model = User 

class AjaxValidation(generic.edit.FormView): 
    def get(self, request, *args, **kwargs): 
     return HttpResponseRedirect('/') 

    def form_invalid(self, form): 
     data = [] 
     for k, v in form._errors.iteritems(): 
      text = { 
       'desc': ', '.join(v), 
      } 
      if k == '__all__': 
       text['key'] = '#%s' % self.request.POST.get('form') 
      else: 
       text['key'] = '#id_%s' % k 
      data.append(text) 
     return HttpResponse(json.dumps(data)) 

    def form_valid(self, form): 
     return HttpResponse("ok") 

    def get_form_class(self): 
     form_dict = { 
      'signup': forms.RegisterForm, 
      'signin': forms.LoginForm, 
      'safety': forms.ProfileEditPasswordForm 
     } 
     return form_dict[self.request.POST.get('form')] #=> TypeError 

Comme vous pouvez le voir, j'ai 3 formes différentes. Les deux premiers fonctionnent très bien. Mais le troisième me renvoie une erreur.

__init__() takes at least 2 arguments (1 given)

Je crois que cela arrive parce que ma forme nécessite un utilisateur de valider son ancien mot de passe, donc je l'ai fait:

'safety': forms.ProfileEditPasswordForm(user=self.request.user) 

Et sais qu'il jette une autre erreur:

'ProfileEditPasswordForm' object is not callable

Et ici je me suis coincé.


Traceback: 
File "***/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "***/env/local/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    71.    return self.dispatch(request, *args, **kwargs) 
File "***/env/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch 
    89.   return handler(request, *args, **kwargs) 
File "***/env/local/lib/python2.7/site-packages/django/views/generic/edit.py" in post 
    213.   form = self.get_form() 
File "***/env/local/lib/python2.7/site-packages/django/views/generic/edit.py" in get_form 
    74.   return form_class(**self.get_form_kwargs()) 

Exception Type: TypeError at /accounts/validate/ 
Exception Value: 'ProfileEditPasswordForm' object is not callable 
Request information: 
GET: No GET data 

POST: 
csrfmiddlewaretoken = u'MjSRpY4NQsTuv6hG8HLYZYI3n9HpPU4R' 
form = u'safety' 
old_password = u'' 
new_password1 = u'' 
new_password2 = u'' 
+0

@MosesKoledoye Le code ci-dessus génère l'erreur – Viktor

+0

Je veux dire la ligne exacte qui a créé l'erreur. C'est difficile à dire en les regardant. Et puis la traceback complète –

+0

J'ai lu des docs vous devez retourner super à partir du formulaire valide pas httpresponse, comme ce retour super (ContactView, auto) .form_valid (formulaire) –

Répondre

1

Je pense que le problème est que django FormView n'est pas compatible avec PasswordChangeForm. Le formulaire nécessite que l'utilisateur soit transmis à son constructeur, mais la vue ne le fera pas. Vous pouvez essayer get_form_kwargs méthode primordial comme ceci:

class AjaxValidation(generic.edit.FormView): 
    # your methods 
    def get_form_kwargs(self): 
     kwargs = super(AjaxValidation, self).get_form_kwargs() 
     kwargs['user'] = self.request.user 
     return kwargs 

Le kwargs sera transmis pour former constructeur et cela devrait fonctionner. get_form_class est OK dans votre exemple de code principal

+0

Je suis désolé, je fogot pour dire que j'utilise Python 2.7 – Viktor

+1

@ViktorDanilov accepté votre modification –