Djangoを初めて使用していて、現在カスタムユーザの作成を試しています。私のカスタムユーザが持っているいくつかの追加のフィールドを除いて、ユーザ名の代わりに電子メールが認証に使用されるように実装しました。また、ユーザーネームは、固有のユーザー名が得られるようにファーストネーム、ラストネーム、および番号を連結することによって生成されます。さて、メールの認証とユーザ名の生成を確認しましたが、私が直面する問題は、Django管理パネルに入り、 'admin'ユーザ名の代わりにUserテーブルを開いたときに空白になってしまうことです。さらに、名、姓などの他のフィールドはすべてのユーザーに表示されません。ユーザ名を生成するための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'
あなたはModelAdmin
クラスときを指定していないので、私は、Djangoの1.10.4
あなたが認証するために、 'email'を使用している場合は、それが簡単に' USERNAME_FIELD =「email''を設定するかもしれません。それで 'username'フィールドやカスタム認証バックエンドは必要ありません。 [docsの例](https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-model)を参照してください。 – Alasdair
最初に、ユーザーが自分のアカウント設定にアクセスしているときにurlにユーザー名を含めることを考えましたが、その後、ユーザー名なしでソリューションを実装すると同時に、管理パネルに関する問題ありがとう! – makons