如何扩展django的createsuperuser管理命令?

时间:2019-01-24 16:58:50

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

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

这很好用,除了./manage createsuperuser破损这一事实之外,因为它不知道添加此自定义必填字段。

结果是,我可以将REQUIRED_FIELDS = ['company']添加到我的自定义用户模型中,这将告诉createsuperuser询问此字段。这样比较好,但是由于company字段是外键,因此它要求提供公司的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'

1 个答案:

答案 0 :(得分: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