Django - как добавить электронную почту к необходимым вещам

Создаю регистрационную форму:

#urls.py
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
from account.views import Register

urlpatterns = patterns('',
    url(r'^register/$', Register.as_view(template_name='account/register.html')),
)

#views.py
from django.views.generic import CreateView
from django.contrib.auth.models import User

class Register(CreateView):
    model = User
    success_url = '/account/'

И у меня есть вопрос: как я могу добавить этот адрес электронной почты (теперь мне нужно только ввести имя пользователя, пароль и 2 раза).

@edit
А как "восстановить" пароль? Когда я создаю пользователя (в этой форме), а затем перехожу в панель администратора, в поле пользователя я вижу «Неверный формат пароля или неизвестный алгоритм хеширования.». Как я могу это исправить?


person mat.mik    schedule 11.01.2013    source источник


Ответы (2)


Причина того, что электронная почта не требуется, заключается в том, что вы используете ModelForm, который во многом зависит от базовой модели User. В частности, атрибут required=True отсутствует в поле email модели.

Одно из решений - создать свою собственную форму с необходимыми атрибутами, возможно, используя ModelForm и добавив необходимое поле электронной почты.

Другое решение, и, вероятно, лучшее, - использовать что-то вроде django-registration, как упомянул Аамир. Аднан в комментариях к вашему вопросу. Это значительно упростит вам жизнь.

Что касается вашего repair password, вы не можете установить пароль на необработанное строковое значение, как вы делаете с вашим CreateView. Чтобы установить пароль, вы должны позвонить в user.set_password(raw_string), который позаботится о хешировании и солении за вас. Посмотрите, как работает встроенный UserCreationForm , и попытайтесь имитировать это, если вы решите создать форму самостоятельно, а не использовать библиотеку (вам не следует).

person Josh Smeaton    schedule 12.01.2013

Для решения этих двух проблем вы можете использовать такую ​​форму:

class UserCreationForm(forms.ModelForm):    
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserCreationForm).__init__(*args, **kwargs)
        self.fields['email'].required = True

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

class Register(CreateView):
    model = User
    form_class = UserCreationForm
    success_url = '/account/'

Но будут и другие проблемы, такие как дублирование имени пользователя.

person sneawo    schedule 12.01.2013