2015-12-06 9 views
0

Я изо всех сил пытаюсь передать некоторые дополнительные данные из моего класса Form в свои представления. Для восстановления пароля пользователь должен указать имя пользователя или адрес электронной почты. При чистке, имя пользователя и пароль проверяются, если один из них существует в базе данных:Передача данных в форму FormView Форма через kwargs

def clean(self): 
    username = self.cleaned_data.get("username") 
    email = self.cleaned_data.get("email") 

    if username: 
     try: 
      user = User.objects.get(username__iexact=username, is_active=True) # <- to view 

     except User.DoesNotExist: 
      raise forms.ValidationError(
       self.error_messages["invalid_username"], 
       code="invalid_username" 
      ) 
    elif email: 
     try: 
      user = User.objects.get(email__iexact=email, is_active=True) # <- to view 

     except User.DoesNotExist: 
      raise forms.ValidationError(
       self.error_messages["invalid_email"], 
       code="invalid_email" 
      ) 
    else: 
     raise forms.ValidationError(
      self.error_messages["empty_form"], 
      code="empty_form" 
     ) 
    return self.cleaned_data 

Когда форма была утверждена, я хочу, чтобы отправить данные пользователя в представлении. Это позволяет отделить логику send_email от формы и возможность добавить некоторую информацию в контекст, чтобы ее можно было отобразить в шаблоне.

Так что в моем FormView, если форма действительна, я хочу иметь возможность использовать объект пользователя, полученный в форме.

В настоящее время я попытался найти несколько «ответов» на другие вопросы и примеры из Интернета. Но я продолжаю получать атрибуты AttributeErrors, KeyErrors, WSGIRequest, которые не поддерживают назначение элемента.

Последняя попытка я сделал было перезаписать инициализации в моей форме, и get_form_kwargs на мой взгляд:

Форма

def __init__(self, *args, **kwargs): 
    self.request = kwargs.pop('request') 
    super(RecoverPasswordForm, self).__init__(*args, **kwargs) 

def clean(self): 
    .... 
    self.request["user"] = User.objects.get(username__iexact=username, is_active=True) 

Посмотреть

def get_form_kwargs(self, **kwargs): 
    kwargs = super(RecoverPassword, self).get_form_kwargs() 
    kwargs["request"] = self.request 
    return kwargs 

что приводит к следующая погрешность

объект «WSGIRequest» не поддерживает назначение элемента

Может кто-нибудь дать мне объяснение того, что я делаю неправильно, и толкать меня в правильном направлении, чтобы решить эту проблему? Заранее спасибо!

ответ

3

Из того, что я понимаю, я думаю, вы пытаетесь отправить электронное письмо с ссылкой на ссылку сброса для пользователя из своего представления после проверки имени пользователя/электронной почты в вашей форме. Затем добавьте некоторую информацию в контекст, чтобы она могла отображаться в шаблоне.

Так что это может сделать путем переопределения метода form_valid в своем классе, как:

def form_valid(self, form): 
    username = form.cleaned_data['username'] 
    email = form.cleaned_data['email'] 
    if username: user = User.objects.get(username__iexact=username, is_active=True) 
    else: user = User.objects.get(email__iexact=email, is_active=True) 
    send_email(user) 
    data = {'info':'give your info here'} 
    render(request, 'success.html', data) 

Подробнее here

Update:

для доступа к объекту пользователя из form сделать например:

def clean(): 
    ... 
    self.cleaned_data["user"] = User.objects.get(username__iexact=username, is_active=True) 

В вашей form_valid

def form_valid(self, form): 
    user = form.cleaned_data['user'] 
    send_email(user) 
    data = {'info':'give your info here'} 
    render(request, 'success.html', data) 
+0

Это будет работать на самом деле, но это означало бы, что я должен выполнить два запроса. Один в форме и один в представлении, которые оба идентичны. Запрос формы требуется для проверки наличия имени пользователя или электронной почты. Если нет, то выполняется проверка validation_error. Я хочу использовать результат запроса в форме в моем form_valid в моем представлении. – Nrzonline

+0

@Nrzonline Я отредактировал свой ответ –

+0

Я попытался что-то вроде этого раньше, но это привело к непреложной ошибке. Не уверен, что я сделал неправильно тогда ...Во всяком случае, это работает отлично. Именно то, что я искал, большое спасибо за вашу помощь! – Nrzonline