Django:超级用户的用户名不会显示在Users表
问题描述:
我是Django的新手,目前正在尝试创建一个自定义用户。除了我的自定义用户拥有的其他字段外,我还实现了将该电子邮件用于身份验证而不是用户名。此外,通过连接名字,姓氏和号码生成用户名,以便获得唯一的用户名。现在,我检查了电子邮件身份验证和用户名生成这似乎工作,但是,我面对的问题是当我进入Django管理面板,并打开用户表,而不是'管理员'用户名有空白。此外,其他字段,例如名字,姓氏等不会显示给所有用户。Django:超级用户的用户名不会显示在Users表
自定义用户和pre_save方法的用户名代(users.models.py):
class User(AbstractUser):
personal_no = models.CharField(verbose_name=_('personal number'), max_length=13)
address = models.CharField(verbose_name=_('address'), max_length=50)
@receiver(pre_save, sender=User)
def generate_username_callback(**kwargs):
instance = kwargs['instance']
if not instance.pk:
instance.username = generate_username(instance.first_name, instance.last_name)
def generate_username(first_name, last_name):
val = "{0}{1}".format(first_name, last_name).lower()
count = 0
while True:
if count == 0 and User.objects.filter(username=val).count() == 0:
return val
else:
new_val = "{0}{1}".format(val, count)
if User.objects.filter(username=new_val).count() == 0:
return new_val
count += 1
if count > 10000:
raise Exception("Too many users named {0}".format(val))
定制后端电子邮件验证(users.backends.py):
class EmailBackend(object):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
return None
else:
if getattr(user, 'is_active', False) and user.check_password(password):
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
users.admin.py:
from django.contrib import admin
from .models import User
admin.site.register(User)
settings.py:
AUTHENTICATION_BACKENDS = [
'users.backends.EmailBackend'
]
AUTH_USER_MODEL = 'users.User'
我使用Django 1.10.4
答
的first_name
和last_name
字段从变更表字段的表丢失,因为你没有指定一个ModelAdmin
类,当你注册你的模型。要使用默认UserAdmin
类,你会怎么做:
from django.contrib.auth.admin import UserAdmin
admin.site.register(User, UserAdmin)
如果你正在使用'email'进行身份验证,那么你可能会发现更容易设置'USERNAME_FIELD =“email''。那么你不需要'username'字段或自定义身份验证后端。请参阅[文档中的示例](https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substitution-a-custom-user-model)。 – Alasdair
起初,我想在用户访问他/她的帐户设置时在网址中包含用户名,但之后我使用从文档发送的示例实现了无用户名的解决方案,同时解决了问题有关管理面板的问题。谢谢! – makons