【问题标题】:Django: Superuser username doesn't show up in Users tableDjango:超级用户用户名未显示在用户表中
【发布时间】:2016-12-16 15:31:13
【问题描述】:

我是 Django 新手,目前正在尝试创建自定义用户。除了我的自定义用户拥有的一些额外字段外,我还实现了电子邮件用于身份验证而不是用户名。此外,通过连接名字、姓氏和数字生成用户名,以便获得唯一的用户名。现在,我检查了似乎有效的电子邮件身份验证和用户名生成,但是,我面临的问题是当我进入 Django 管理面板并打开用户表而不是“管理员”用户名时出现空白。此外,其他字段(例如名字、姓氏等)不会显示给所有用户。

Screenshot of the admin panel

用户名生成的自定义用户和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

【问题讨论】:

  • 如果您使用email 进行身份验证,那么您可能会发现设置USERNAME_FIELD = 'email' 更容易。那么您就不需要username 字段或自定义身份验证后端。请参阅example in the docs
  • 起初我想在用户访问他/她的帐户设置时在 url 中包含一个用户名,但后来我使用了您从文档发送的示例来实现没有用户名的解决方案同时也解决了管理面板的问题。谢谢!

标签: python django


【解决方案1】:

更改列表字段的表中缺少first_namelast_name 字段,因为您在注册模型时没有指定ModelAdmin 类。要使用默认的 UserAdmin 类,您可以:

from django.contrib.auth.admin import UserAdmin

admin.site.register(User, UserAdmin)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 2019-01-26
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2022-11-25
    • 2011-02-03
    相关资源
    最近更新 更多