【问题标题】:How do I extend django's createsuperuser management command?如何扩展 django 的 createsuperuser 管理命令?
【发布时间】:2019-01-24 16:58:50
【问题描述】:

我通过添加一个强制性的Company 字段来扩展我的用户模型,这样每个用户都属于某个公司。 Company 字段是另一个定义公司的模型的外键。

这很好用,除了 ./manage createsuperuser 坏了,因为它不知道添加这个自定义的必填字段。

原来我可以将REQUIRED_FIELDS = ['company'] 添加到我的自定义用户模型中,这将告诉createsuperuser 请求该字段。这更好,但由于公司字段是外键,它要求提供公司的 ID,任何使用createsuperuser 命令的人都必须查找该 ID - 不完全是用户友好的。我希望使用createsuperuser 命令创建的所有管理员都属于同一公司,并且如果该公司不存在,则自动创建该公司。

阅读django的documentation on createsuperuser,它提到了我想做的确切的事情,以及我想做的确切原因:

您可以子类化管理命令并覆盖 get_input_data() 如果您想自定义数据输入和验证。咨询源码 有关现有实现和方法的详细信息的代码 参数。例如,如果您有 ForeignKey,它可能会很有用 在 REQUIRED_FIELDS 中并希望允许创建实例而不是 输入现有实例的主键。

我只是不确定我应该在项目的哪个位置覆盖 get_input_data() 方法。

编辑:

我扩展用户模型的方式是将其添加到我的一个应用程序 (login_app) 的 models.py 中:

class User(AbstractUser):
    company = models.ForeignKey(Company, on_delete=models.CASCADE, blank=False, null=False)

并将其添加到 settings.py:

AUTH_USER_MODEL = 'login_app.User'

【问题讨论】:

  • 你使用自定义身份验证模型还是 django 默认身份验证模型?
  • 不确定。我添加了一些关于如何扩展我的用户模型的更多细节。这是否意味着我正在使用自定义身份验证模型?我仍在使用用户名和密码进行身份验证,如果这就是您的意思。

标签: django python-3.x django-2.1


【解决方案1】:

您需要创建自定义命令,请参阅 Django 的相关文档here。 试试下面的方法:

from django.contrib.auth.management.commands import createsuperuser

class Command(createsuperuser.Command):
    def get_input_data(self, field, message, default=None):
        """
        Override this method if you want to customize data inputs or
        validation exceptions.
        """
        raw_value = input(message)
        if default and raw_value == '':
            raw_value = default
        try:
            val = field.clean(raw_value, None)
        except exceptions.ValidationError as e:
            # here you FK code 

        return val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2014-11-03
    • 2017-04-10
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多