我通过添加必填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'
答案 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