我正在使用django的内置身份验证系统。一切似乎都很好。在注册时,请求用户输入两个字段:username
和email
。登录时,他们需要输入username
和password
。
我想更改此行为,以便用户名字段消失。我想将电子邮件视为用户名。因此,登录用户时需要放置email
/ password
这仍然可以在使用django的内置auth系统吗?我在django 1.7
更新
我需要添加其他字段,因此我将以下内容添加到models.py
来自django.db导入模型 来自django.contrib.auth.models导入用户
class UserProfile(models.Model):
user = models.OneToOneField(User)
telephone_number = models.CharField(max_length=100)
website_url = models.CharField(max_length=100)
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
答案 0 :(得分:0)
答案直接在django documentation中,简而言之,您应该继承AbstractBaseUser
或AbstractUser
(在第二种情况下,您无法完全删除用户名字段),创建自己的用户管理器基于BaseUserManager
或UserManager
并定制内置身份验证表单(如果您正在使用它)(或您正在使用的任何应用程序正在使用它)。
答案 1 :(得分:0)
这不是严格的大炮,但为了避免创建新的User类或Auth后端,我倾向于让用户使用用户名或电子邮件登录。
无论如何,你要确保电子邮件是唯一的,因为django默认不会检查这个。
然后,您必须覆盖默认登录视图以支持此操作。您可以创建以下内容:
class EmailUsernameLoginView(View):
def post(self, request):
next = request.POST.get('next', None)
username = request.POST.get('username', None)
password = request.POST.get('password', None)
error = ''
if username and password:
try:
usr = User.objects.get(email=username)
username = usr.username
except User.DoesNotExist:
pass # If the user doesn't exist, it's an username
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return redirect(next)
else:
error = 'Your account is not active'
else:
error = 'The username / email - password comb is wrong'
else:
error = 'Please provide a username / email and password'
ctx = {'error': error} # Fill with needed feedback
return render(request, ctx, 'registration/login.html')
这只是一个草稿,你应该提供一个表格来帮助验证/清理