2016-12-16 9 views
0

Djangoを初めて使用していて、現在カスタムユーザの作成を試しています。私のカスタムユーザが持っているいくつかの追加のフィールドを除いて、ユーザ名の代わりに電子メールが認証に使用されるように実装しました。また、ユーザーネームは、固有のユーザー名が得られるようにファーストネーム、ラストネーム、および番号を連結することによって生成されます。さて、メールの認証とユーザ名の生成を確認しましたが、私が直面する問題は、Django管理パネルに入り、 'admin'ユーザ名の代わりにUserテーブルを開いたときに空白になってしまうことです。さらに、名、姓などの他のフィールドはすべてのユーザーに表示されません。ユーザ名を生成するための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' 

あなたはModelAdminクラスときを指定していないので、私は、Djangoの1.10.4

+1

あなたが認証するために、 'email'を使用している場合は、それが簡単に' USERNAME_FIELD =「email''を設定するかもしれません。それで 'username'フィールドやカスタム認証バックエンドは必要ありません。 [docsの例](https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-model)を参照してください。 – Alasdair

+0

最初に、ユーザーが自分のアカウント設定にアクセスしているときにurlにユーザー名を含めることを考えましたが、その後、ユーザー名なしでソリューションを実装すると同時に、管理パネルに関する問題ありがとう! – makons

答えて

1

first_namelast_nameフィールドはチェンジフィールド上の表から欠落しているを使用していますあなたのモデルを登録しました。デフォルトUserAdminクラスを使用するには、どうなる:

from django.contrib.auth.admin import UserAdmin 

admin.site.register(User, UserAdmin) 
関連する問題