2016-01-05 3 views
0

Я создал форму «изменить профиль», где вы можете сделать очень классическую вещь: измените свой пароль.Дизайн валидации: форма или вид?

Таким образом, у меня есть 3 поля: старый пароль, новый пароль и новый тип пароля.

проблема есть дизайн. я сначала проверить, что все набранное нормально в виде clean метод:

def clean(self): 
    old = self.cleaned_data.get('old_password') 
    new1 = self.cleaned_data.get('new_password1') 
    new2 = self.cleaned_data.get('new_password2') 
    if old: 
     if not new1: 
      raise ValidationError(_(u'New password missing')) 
     if not new2: 
      raise ValidationError(_(u'New password missing')) 
     if new1 != new2: 
      raise ValidationError(_(u"The new password " 
            u"is not the same twice")) 
    return super(ProfileForm, self).clean() 

С моей формы, если я не взломать, я не могу доступ к пользователю в данный момент вошедшего в Моего вопроса о дизайне:. В лучше взломать в виде кода, и изменить пароль там так в формеis_valid(), или лучше сделать это в зренияform_valid() метод?

ответ

2

Django на самом деле имеет встроенную форму для изменения пароля пользователя, на который вы можете ссылаться. См. SetPasswordForm и PasswordChangeForm по телефону https://github.com/django/django/blob/master/django/contrib/auth/forms.py.

Не изменяйте пароль в методе is_valid(), он используется только для проверки. Вы можете переопределить форму __init__ формы, чтобы взять пользователя, и метод save, чтобы изменить пароль.

class MyForm(forms.Form): 

    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.user = user 

    def save(self, commit=True): 
     password = self.cleaned_data["new_password1"] 
     self.user.set_password(password) 
     if commit: 
      self.user.save() 
     return self.user 

Операция по изменению пароля должна выполняться в виде отдельного метода. Вот пример кода вида вам потребуется:

class MyView(TemplateView): 

    def post(self, request, *args, **kwargs): 
     form = MyForm(user=request.user, data=request.POST) 
     if form.is_valid(): 
      form.save() # password updated 
      return redirect(<somehwere>) 

     # the password change has failed form validation 
     return self.render_to_response({}) 

Чтобы ответить на ваш вопрос, то лучше изменить пароль в форме, в отличие от точки зрения. В Django довольно распространенный шаблон для выполнения операций с данными в формах (например, ModelForm.save()), и большая часть собственного кода Django также изменяет данные модели в формах.

Это отделяет логику изменения данных модели от представления и упрощает ее устранение и обоснование (например, вам не нужно полагаться на представление для проверки операции смены пароля).

0

Во-первых, Django имеет view и form для смены паролей], вы должны использовать их, если это возможно.

Если вам действительно нужно изменить свой собственный вид и форму, я думаю, что это нормально, чтобы изменить пароль в методах form_valid().

Вы можете перенести код, который устанавливает новый пароль для метода в форме, а затем вызвать этот метод в методе form_valid. Недостатком этого подхода является то, что вам придется переопределить метод формы __init__ и метод get_form_kwargs вида, чтобы передать пользователя в форму, что делает его более сложным. Преимущество состоит в том, что вы инкапсулировали функциональность в представлении.

Не переоценивайте метод формы is_valid(). Цель этого метода - проверить, действительно ли форма. Вам редко приходится переопределять его.

Смежные вопросы