0

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

长部分:我将创建一个与Django 1.8 的 UserCreationForm非常相似的表单。我不确定为什么我找不到 3.1 的相同代码(这让我更加怀疑我的想法是否出于某种原因可能是不好的做法)但基本上我会这样做:为默认用户模型 set 创建一个 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})
...

创建用户.html

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

2 回答 2

1

您的表格似乎恰到好处尝试类似:

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

那应该这样做也更新了我

于 2020-10-22T13:59:59.577 回答
0

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

  1. 使用 AbstractBaseUser 并且您可以将用户名字段设置为 null 为真。

  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
    
于 2020-10-22T08:47:52.667 回答