简短的问题(实际上不需要阅读其余部分):我已经阅读了有关如何让用户通过电子邮件登录的多个线程/教程(例如这个)。我想知道:为什么我不能简单一点,在注册时要求提供电子邮件地址,然后将用户名设置为该电子邮件地址并保存用户?
长部分:我将创建一个与 Django 1.8 的 UserCreationForm 非常相似的表单。我不确定为什么我找不到 3.1 的相同代码(这让我更加想知道我的想法是否由于某种原因可能是不好的做法)但基本上我会这样做:为默认用户模型创建一个 ModelForm,设置
fields = ["email"]
,在模板中将其手动渲染为 {{form.email}}
,然后在视图中,我将调用 form.save(commit=False)
来获取对象,将该对象的用户名设置为给定的电子邮件地址并保存。哦,我不是吗? :-)
编辑
由于询问了更多源代码,这基本上就是我的意思:
forms.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
views.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()
这样也应该更新我
这是一个很好的问题,你可以做很多事情,比如
使用 AbstractBaseUser 并且您可以将用户名字段设置为 null 为 true。
或者更好的方法是使用 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