【问题标题】:In Django, is it possible for superusers to have different required fields than non-superusers?在 Django 中,超级用户是否可以拥有与非超级用户不同的必填字段?
【发布时间】:2017-07-18 12:24:26
【问题描述】:

我知道超级用户和普通用户都只是 django 的用户对象,但是我如何编写一个自定义用户类,它需要普通用户的一些字段而超级用户不需要这些字段?

【问题讨论】:

标签: python django python-2.7 django-models


【解决方案1】:

数据库中没有任何结构是棘手的。例如,当应用程序增长时,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

【讨论】:

    【解决方案2】:

    您可以为用户创建一个带有外键的配置文件类(例如 UserProfile),该类仅在用户使用网站的注册表单注册时创建。这样,在管理站点或通过命令行创建的超级用户不需要附加额外的配置文件实例。

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2012-04-28
      • 2021-04-01
      • 1970-01-01
      • 2021-06-22
      • 2011-03-28
      相关资源
      最近更新 更多