Django注册:将用户名设置为提供的电子邮件地址并保存



简短问题(无需阅读其余部分(:我已经阅读了多个关于如何让用户通过电子邮件登录的线程/教程(例如本教程(。我想知道:为什么我不能保持简单,在注册时询问电子邮件地址,然后将用户名设置为该电子邮件地址并保存用户

长段:我将创建一个与Django 1.8的UserCreationForm非常相似的表单。我不知道为什么我找不到3.1的相同代码(这让我更加怀疑我的想法是否出于某种原因是错误的做法(,但基本上我会这样做:为默认用户模型创建一个ModelForm,设置fields = ["email"],在模板中手动将其渲染为{{form.email}},然后在视图中,我会调用form.save(commit=False)来获取对象,将该对象的用户名设置为给定的电子邮件地址并保存。或者我不这样做吗?:-(

编辑

由于询问了更多的源代码,我的意思基本上是:

表单.py

class UserCreationForm(forms.ModelForm):
class Meta:
model = User
fields = ["email"]
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.username = self.cleaned_data["email"]
if commit:
user.save()
return user

视图.py

...
form = UserCreationForm()
return render(request, 'myapp/createuser.html', {'form': form})
...

createuser.html

<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Register</button>
</form>

您的表单似乎刚刚好,请尝试以下内容:

obj = form.save(commit=False)
obj.username= email
obj.save()

这应该也会更新我的

这是一个很好的问题,你可以做多种事情,比如

  1. 使用AbstractBaseUser,您可以将username字段设置为null为true。

  2. 或者最好使用AbstractBaseUser、PermissionsMixin、BaseUserManager,在您的用户模型管理器中,您可以这样做;

    def create_user(self,email,username,profile_pic,password=None):
    if not email:
    raise ValueError("Email can't be empty")
    if not username:
    raise ValueError("Username can't be empty")
    email = self.normalize_email(email)
    username = email
    user = self.model(
    email=email,
    username=username,
    profile_pic=profile_pic,
    )
    user.set_password(password)
    user.save()
    return user
    

最新更新