首页 > 解决方案 > 如何扩展 django 的 createsuperuser 管理命令?

问题描述

我通过添加一个必填字段来扩展我的用户模型Company,以便每个用户都属于某个公司。该Company字段是定义公司是什么的另一个模型的外键。

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

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

阅读 django关于 createsuperuser 的文档,它提到了我想做的确切事情,以及我想做的确切原因:

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

我只是不确定我应该在我的项目中的哪个位置覆盖 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'

标签: djangopython-3.xdjango-2.1

解决方案


You need to create a custom command, see Django's related documentation here. Try something like below:

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

推荐阅读