Как с помощью ajax проверить форму обмена паролем?

#python #ajax #django #python-2.7 #django-1.8

#python #ajax #django #python-2.7 #django-1.8

Вопрос:

У меня есть несколько форм, которые я хочу проверить с помощью ajax-представления.

 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
  

Как вы можете видеть, у меня есть 3 разные формы. Первые два работают просто отлично. Но третий возвращает мне ошибку.

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

Я считаю, что это происходит потому, что моя форма требует от пользователя проверки его старого пароля, поэтому я сделал это:

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

И знайте, что это выдает другую ошибку:

'ProfileEditPasswordForm' object is not callable

И здесь я застрял.


 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''
  

Комментарии:

1. @MosesKoledoye Приведенный выше код выдает ошибку

2. Я имею в виду точную строку, которая вызвала ошибку. трудно сказать, просто взглянув на них. А затем полная трассировка

3. я читал документы, в которых вам нужно возвращать super из формы, действительной, а не httpresponse , например, возвращать super(ContactView, self).form_valid(форма)

4. проверьте это docs.djangoproject.com/en/1.10/ref/class-based-views /…

5. @AnatolyStrashkevich Прошу прощения, но это не тот случай. И вы можете возвращать все, что хотите, поскольку возвращается HttpResponseRedirect form_valid . Ознакомьтесь с исходным кодом Django github.com/django/django/blob/stable/1.8.x/django/views/generic /…

Ответ №1:

Я думаю, проблема в том, что django FormView несовместим с. PasswordChangeForm Форма требует, чтобы пользователь был передан ее конструктору, но представление этого не сделает. Вы могли бы попробовать переопределить get_form_kwargs метод следующим образом:

 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
  

Он kwargs будет передан конструктору формы, и он должен работать. get_form_class в вашем основном примере кода все в порядке

Комментарии:

1. Извините, я не хочу говорить, что я использую Python 2.7