【问题标题】:How to remove the Username field from the UserCreationForm in Django如何从 Django 中的 UserCreationForm 中删除用户名字段
【发布时间】:2011-11-23 09:57:04
【问题描述】:

我希望我的用户注册页面显示电子邮件和密码字段,并且没有用户名。 我已经创建了这个注册表单:

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

但用户名仍然出现。我需要覆盖其他东西吗?

【问题讨论】:

  • 我认为用户名字段来自UserCreationForm,所以exclude来自那里!

标签: django forms django-registration


【解决方案1】:

您可以像这样从表单的字段中弹出用户名:

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()

【讨论】:

  • 对不起,带有email字段的LoginForm会先显示密码,然后再显示email。将其放入 init 以解决该问题: self.fields.keyOrder = ['email','password',]
【解决方案2】:

【讨论】:

  • 这就是你的互联网。我应该在这里粘贴网站的内容。现在我什至不再使用 django 了。对不起我的错。
【解决方案3】:

将该字段添加到 Meta 类的排除:

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

    class Meta:
        model = User
        exclude = ['username',]

【讨论】:

  • 那真的没有帮助。所以我尝试了该排除的不同变体,但它对我不起作用。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2020-06-29
  • 1970-01-01
  • 2016-07-05
相关资源
最近更新 更多