2016-12-16 53 views
0

我是Django的新手,目前正在嘗試創建一個自定義用戶。除了我的自定義用戶擁有的其他字段外,我還實現了將該電子郵件用於身份驗證而不是用戶名。此外,通過連接名字,姓氏和號碼生成用戶名,以便獲得唯一的用戶名。現在,我檢查了電子郵件身份驗證和用戶名生成這似乎工作,但是,我面對的問題是當我進入Django管理面板,並打開用戶表,而不是'管理員'用戶名有空白。此外,其他字段,例如名字,姓氏等不會顯示給所有用戶。Django:超級用戶的用戶名不會顯示在Users表

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

+1

如果你正在使用'email'進行身份驗證,那麼你可能會發現更容易設置'USERNAME_FIELD =「email''。那麼你不需要'username'字段或自定義身份驗證後端。請參閱[文檔中的示例](https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substitution-a-custom-user-model)。 – Alasdair

+0

起初,我想在用戶訪問他/她的帳戶設置時在網址中包含用戶名,但之後我使用從文檔發送的示例實現了無用戶名的解決方案,同時解決了問題有關管理面板的問題。謝謝! – makons

回答

1

first_namelast_name字段從變更表字段的表丟失,因爲你沒有指定一個ModelAdmin類,當你註冊你的模型。要使用默認UserAdmin類,你會怎麼做:

from django.contrib.auth.admin import UserAdmin 

admin.site.register(User, UserAdmin) 
相關問題