如何解决Django注册:将用户名设置为提供的电子邮件地址并保存?
简短的问题(实际上没有必要阅读其余部分):我已经阅读了有关如何让用户通过电子邮件登录的多个线程/教程(例如this one)。我想知道:为什么我不能简单一些,在注册时要求一个电子邮件地址,然后将用户名设置为该电子邮件地址并保存用户?
很大一部分:我将创建一个与UserCreationForm of Django 1.8非常相似的表单。我不确定为什么无法在3.1中找到相同的代码(这使我更加怀疑我的想法是否由于某种原因是不好的做法),但基本上我会这样做:为默认用户模型创建一个ModelForm,设置{ {1}},在模板中将其手动呈现为fields = ["email"]
,然后在视图中调用{{form.email}}
来获取对象,将该对象的用户名设置为给定的电子邮件地址,然后保存。我不是Orrrr吗? :-)
编辑
由于询问了更多的源代码,因此基本上就是我的意思:
forms.py
form.save(commit=False)
views.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
createuser.html
...
form = UserCreationForm()
return render(request,'myapp/createuser.html',{'form': form})
...
解决方法
这是一个很好的问题,您可以做类似的事情
-
使用AbstractBaseUser,您可以将username字段设置为null。
-
或者更好的一种使用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
您的表单似乎恰到好处,请尝试以下操作:
obj = form.save(commit=False)
obj.username= email
obj.save()
那应该也能使我更新
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。