Django, ModelForms, User и UserProfile - без хеширования пароля - PullRequest
5 голосов
/ 29 мая 2010

Я пытаюсь установить отношение между пользователем и пользовательским профилем, отобразить форму и сохранить данные.

При отправке данные сохраняются, кроме поле пароля не хэшируется.

Forms.py

class UserForm(forms.ModelForm):
    username = forms.RegexField(label="Username", max_length=30,
         regex=r'^[\w.@+-]+$', help_text = "My text",
         error_messages = {'invalid':
           "This value may contain only letters, numbers and @/./+/-/_ characters."
         }
    )
    password = forms.CharField(label="Password",
                              widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ["first_name", "last_name", "username",  "email", "password"]

    def clean_username(self):
        username = self.cleaned_data['username']
        if not re.search(r'^\w+$', username):
            raise forms.ValidationError(
                  'Username can contain only alphanumeric characters')
        try:
            User.objects.get(username=username)
        except ObjectDoesNotExist:
            return username
        raise forms.ValidationError('Username is already taken')

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['user_is']

Ответы [ 2 ]

8 голосов
/ 29 мая 2010

Хорошо, чтобы ответить на мой собственный вопрос. Это может пригодиться другим.

Добавьте следующее к UserForm классу

def save(self, commit=True):
   user = super(UserForm, self).save(commit=False)
   user.set_password(self.cleaned_data["password"])
   if commit:
       user.save()
   return user
8 голосов
/ 29 мая 2010

РЕДАКТИРОВАТЬ: исходный вопрос был отредактирован после написания этого ответа

Чтобы установить пароль для пользователя, вы не устанавливаете profile.user.password = new_password - это то, что делает использование модели в этом случае; это установит его непосредственно как неискаженное значение.

Вам необходимо использовать соответствующий API для установки пароля. Итак, прежде чем profile.save() поставить:

profile.user.set_password(uform.cleaned_data['password'])

Чтобы уничтожить текст help_text, либо не используйте быстрый рендеринг form.as_foo, либо переопределите поле, чтобы значение help_text отсутствовало в методе init () вашей ModelForm (см. Документы Django для форм) а

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...