Как удалить поле Имя пользователя из UserCreationForm в Django - PullRequest
7 голосов
/ 23 сентября 2011

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

class RegisterForm(UserCreationForm):
    email = forms.EmailField(label = "Email")
    #fullname = forms.CharField(label = "First name")

    class Meta:
        model = User
        fields = ("email", )

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

Но имя пользователя все еще появляется. Нужно ли переопределить что-то еще?

Ответы [ 3 ]

7 голосов
/ 05 марта 2012

Вы можете выдвинуть имя пользователя из полей формы следующим образом:

class RegisterForm(UserCreationForm):

    def __init__(self, *args, **kwargs): 
        super(RegisterForm, self).__init__(*args, **kwargs) 
        # remove username
        self.fields.pop('username')
    ...

Но тогда вам нужно будет ввести произвольное имя пользователя перед сохранением, например так:

from random import choice
from string import letters
...

class RegisterForm(UserCreationForm):
...
    def save(self):
        random = ''.join([choice(letters) for i in xrange(30)])
        self.instance.username = random
        return super(RegisterForm, self).save()

Существуют и другие соображения, которые необходимо учитывать при взломе, например, убедитесь, что ваша LoginForm будет выдвигать имя пользователя позже, когда это необходимо:

class LoginForm(AuthenticationForm):

    email = forms.EmailField(label=_("E-mail"), max_length=75)

    def __init__(self, *args, **kwargs): 
        super(LoginForm, self).__init__(*args, **kwargs) 
        self.fields['email'].required = True 
        # remove username
        self.fields.pop('username')

    def clean(self):
        user = User.objects.get(email=self.cleaned_data.get('email'))
        self.cleaned_data['username'] = user.username
        return super(LoginForm, self).clean()
1 голос
/ 09 октября 2011

Нашел это.Это именно то, что я хотел сделать: http://www.micahcarrick.com/django-email-authentication.html

0 голосов
/ 23 сентября 2011

Добавьте это поле в исключаемый класс Meta:

class RegisterForm(UserCreationForm):
    email = forms.EmailField(label = "Email")
    #fullname = forms.CharField(label = "First name")

    class Meta:
        model = User
        exclude = ['username',]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...