2017-02-27 3 views
1

スーパーユーザと普通のユーザはどちらもちょうどdjangoのUserオブジェクトですが、普通のユーザにはいくつかのフィールドを必要とし、スーパーユーザにはそのフィールドを必要としないカスタムユーザクラスを書くにはどうすればよいですか?Djangoでは、スーパーユーザがスーパー以外のユーザとは異なるフィールドを持つことは可能でしょうか?

+0

[Django動的モデルフィールド]の複製が可能です(http://stackoverflow.com/questions/7933596/django-dynamic-model-fields) –

答えて

0

データベース内の構造は複雑ではありません。例えば、JSONFieldsは、アプリが成長したときに飼い慣らすのが非常に難しいかもしれません。

私はそれを "シンプル"にしようと考えています - より保守性があります(あなたが将来モデルを拡張したいかもしれないようなことをしなければならないと想像します)。これが新しいプロジェクトの場合は、簡単にchange the default user modelすることができます。しかし、それはあなたのケースであなたを助けるかもしれません。

from django.db import models 
from django.contrib.auth.models import AbstractBaseUser 

class Mortal(AbstractBaseUser): 
    is_superuser = False 

    username = models.CharField(max_length=256) 
    first_name = models.CharField(max_length=256) 
    last_name = models.CharField(max_length=256) 

class Admin(AbstractBaseUser): 
    is_superuser = True 

    username = models.CharField(max_length=256) 

、その後make your own authentication backend

class MyBackend(object): 
    """ 
    Danger! A backend to authenticate only via username 
    """ 

    def authenticate(self, username=None): 
     try: 
      return Mortal.objects.get(username=username) 
     except Mortal.DoesNotExist: 
      try: 
       return Admin.objects.get(username=username) 
      except Admin.DoesNotExist: 
       return None 
1

は、あなたが作成されるユーザーへの外部キーを持つプロファイルクラス(たとえばのUserProfile)を持つことができます

あなたは常に2つのモデルを作ることができますユーザーがウェブサイトの登録フォームを使用してサインアップした場合のみ。このようにして、管理サイトやコマンドラインから作成されたスーパーユーザーは、追加のプロファイルインスタンスを追加する必要はありません。

関連する問題