2013-02-26 3 views
0

Я хочу сделать следующее: - Разрешить пользователям изменять свой адрес электронной почты в форме. - Если их электронная почта уже существует в базе данных, они видят ошибку, пока отправленное им письмо принадлежит другому лицу, кроме себя. Поэтому, если человек A отправляет письмо по электронной почте [email protected], а лицо B уже имеет это письмо - есть ошибка. Если человек A отправляет письмо по электронной почте [email protected], и это тот же адрес электронной почты, который она использовала, тогда нет ошибки.Редактирование профиля Django

Как это сделать с помощью Django?

У меня есть следующий код:

class UserEditForm(forms.ModelForm): 

    class Meta: 
     model = User 
     fields = ('first_name', 'email', 'last_name',) 

    def clean_email(self): 
     email = self.cleaned_data['email'] 

     if email == self.email: 
      return email 

     try: 
      DjangoUser.objects.get(email=email) 
      raise ValidationError('Email is already taken.') 
     except DjangoUser.DoesNotExist: 
      pass 

     return email 

    email = forms.EmailField(required=True) 

Проблема в том, self.email не дает мне текущий адрес электронной почты человека. :(

ответ

0

Что вы хотите, текущий пользователь (хранится в request), точнее его/ее электронной почты.

Так что я хотел бы предложить, как обходной путь будет проходить или установить request/e-mail/user в виде

приведен пример установки user в вашем form через view после того, как форма создана:.

# views.py 
def someview(request): 
    if request.method == 'POST': 
     user_edit_form = UserEditForm(request.POST) 
     user_edit_form.actual_user = request.user 
     if user_edit_form.is_valid(): 
      do_some_stuff() 

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

self.actual_user.email == self.cleaned_data['email'] 

Естественно, вы можете установить только электронную почту пользователя, если вам не нужен весь пользователь.