gpt4 book ai didi

python - 在 Django 用户模型中需要 first_name 和 last_name

转载 作者:搜寻专家 更新时间:2023-10-30 23:35:10 24 4
gpt4 key购买 nike

django.contrib.auth.models.User中,first_namelast_name字段都有blank=True。如何在我自己的模型中使它们blank=False, null=False

这是我的实现,基本上遵循Extending the existing User model的指令:

models.py

class Fellow(models.Model):

user = models.OneToOneField(
User,
on_delete=models.CASCADE
)

first_name = models.CharField(
_("first_name"),
max_length=30,
)
last_name = models.CharField(
_("last_name"),
max_length=30,
)

# other fields omitted

from . import signals

signals.py

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import Fellow


@receiver(post_save, sender=User)
def create_fellow_on_user_create(sender, instance, created, **kwargs):
if created:
Fellow.objects.create(user=instance)

但是,在python manage.py shell中测试时出现错误:

>>> f = Fellow.objects.create(username='username', password='passwd')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site-packages/django/db/models/query.py", line 392, in create
obj = self.model(**kwargs)
File "/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site-packages/django/db/models/base.py", line 571, in __init__
raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])
TypeError: 'username' is an invalid keyword argument for this function

最佳答案

您误解了教程。您所指的员工示例解释了如何添加到 User 这是通过 OneToOneField 完成的,它使原始 User 模型完好无损但出于所有实际目的,就好像 User 有一个名为 department 的新字段。这是通过在数据库中创建两个单独的表来实现的。

有一个警告,在 EmployeeFellow 中,如果不首先创建 User,您不能按照您尝试过的方式直接创建新实例 实例。那是因为这些模型都不直接拥有用户名字段。所以分两步做

user = User(username='Sun')   
user.set_password('123')
user.save()

f = Fellow(user=user)

但这种方法仍然不太理想。您在两个模型中都有 first_name 和 last_name 字段。它总是会导致困惑。正确的方法是继承 AbstractBaseUser

class Fellow(AbstractBaseUser):

first_name = models.CharField(max_length=254)

AbstractBaseUser 是一个简单的用户(参见代码:https://github.com/django/django/blob/master/django/contrib/auth/base_user.py#L47)它没有 first_name 和 last_name,因此您可以使用您想要的行为添加它们。

关于python - 在 Django 用户模型中需要 first_name 和 last_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com