在django中,我是否以错误的方式重写了模型上的save方法?
我有一个在django中,我是否以错误的方式重写了模型上的save方法?,django,django-models,Django,Django Models,我有一个配置文件模型,它像这样扩展了用户模型 class Profile(User): user = models.OneToOneField(User, parent_link=True, on_delete=models.CASCADE) slug = models.SlugField(unique=True, blank=True) def save(self, *args, **kwargs): print('self.username')
配置文件
模型,它像这样扩展了用户模型
class Profile(User):
user = models.OneToOneField(User, parent_link=True, on_delete=models.CASCADE)
slug = models.SlugField(unique=True, blank=True)
def save(self, *args, **kwargs):
print('self.username')
print(self.username)
self.slug = self.username
super(Profile, self).save(*args, **kwargs)
我试图为我的模型创建一个slug字段,所以我重写save方法,将slug作为用户名。问题是,当我使用命令
createsuperuser
创建一个新用户并打印出您在代码中看到的用户名时,它不会显示任何内容-它不会显示提供的用户名。这就是我为什么要这样做的原因吗?如果是这样,我如何修复它?您正确地覆盖了save方法。使用createsuperuser
命令时,需要做更多的工作
from django.utils.text import slugify
from django.contrib.auth.models import UserManager
class CustomUserManager(UserManager):
def _create_user(self, username, email, password, **extra_fields):
username_slug = slugify(username)
extra_fields.setdefault('slug', username_slug)
super()._create_user(username, email, password, **extra_fields)
class Profile(User):
user = models.OneToOneField(User, parent_link=True, on_delete=models.CASCADE)
slug = models.SlugField(unique=True, blank=True)
def save(self, *args, **kwargs):
print('self.username')
print(self.username)
self.slug = slugify(self.username)
super().save(*args, **kwargs)
objects = CustomUserManager()
您正在正确重写save方法。使用
createsuperuser
命令时,需要做更多的工作
from django.utils.text import slugify
from django.contrib.auth.models import UserManager
class CustomUserManager(UserManager):
def _create_user(self, username, email, password, **extra_fields):
username_slug = slugify(username)
extra_fields.setdefault('slug', username_slug)
super()._create_user(username, email, password, **extra_fields)
class Profile(User):
user = models.OneToOneField(User, parent_link=True, on_delete=models.CASCADE)
slug = models.SlugField(unique=True, blank=True)
def save(self, *args, **kwargs):
print('self.username')
print(self.username)
self.slug = slugify(self.username)
super().save(*args, **kwargs)
objects = CustomUserManager()
如果您确定不希望将用户的配置文件数据放在单独的模型中,并将
OneToOneField
返回到Django的默认user
,那么您可能应该按照文档中的规定,将AbstractUser
子类化,而不是user
考虑这一部分:
如果您对Django的用户模型非常满意,并且只想添加一些额外的配置文件信息,那么只需将Django.contrib.auth.models.AbstractUser子类化并添加自定义配置文件字段[…]
(来自)
然后你会这样说:
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import UserManager
from django.utils.text import slugify
from django.db import models
class User(AbstractUser):
slug = models.SlugField(unique=True, blank=True)
objects = UserManager()
def save(self, *args, **kwargs):
print('self.username')
print(self.username)
self.slug = slugify(self.username)
super().save(*args, **kwargs)
然后,定义settings.AUTH\u USER\u MODEL
AUTH_USER_MODEL = "myapp.User" # also, add 'myapp' to INSTALLED_APPS
请记住:您需要像这样引用您的用户模型(不管您是否自定义了该模型,您都应该这样做):
如果您确定不希望将用户的配置文件数据放在单独的模型中,并将
OneToOneField
返回到Django的默认user
,那么您可能应该按照文档中的规定,将AbstractUser
子类化,而不是user
考虑这一部分:
如果您对Django的用户模型非常满意,并且只想添加一些额外的配置文件信息,那么只需将Django.contrib.auth.models.AbstractUser子类化并添加自定义配置文件字段[…]
(来自)
然后你会这样说:
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import UserManager
from django.utils.text import slugify
from django.db import models
class User(AbstractUser):
slug = models.SlugField(unique=True, blank=True)
objects = UserManager()
def save(self, *args, **kwargs):
print('self.username')
print(self.username)
self.slug = slugify(self.username)
super().save(*args, **kwargs)
然后,定义settings.AUTH\u USER\u MODEL
AUTH_USER_MODEL = "myapp.User" # also, add 'myapp' to INSTALLED_APPS
请记住:您需要像这样引用您的用户模型(不管您是否自定义了该模型,您都应该这样做):
配置文件不能继承用户,但应该继承模型。而且,为了创建用户能够在不同的表(概要文件)中创建相应的行并设置slug,将涉及使用。概要文件不能继承用户,而应该继承模型。而且,要创建用户以便能够在不同的表(配置文件)中创建相应的行并设置slug,还需要使用。不幸的是,用户仍然没有用户名。我现在已经测试了它,它对我有效。您创建的任何新用户(无论是使用createsuperuser命令还是调用profile_obj.save()都会根据用户名自动生成一个slug。)我现在意识到您不希望此配置文件成为您的用户模型。我测试它的前提是它将等同于一个用户模型,但使用不同的名称。不幸的是,用户仍然没有用户名。我现在已经测试了它,它适合我。您创建的任何新用户(无论是使用createsuperuser命令还是调用profile_obj.save()都会根据用户名自动生成一个slug。)我现在意识到您不希望此配置文件成为您的用户模型。我测试它时假设它将等同于一个用户模型,但名称不同。非常感谢这一个对我有用,我想知道为什么文档没有你的答案那么清楚,例如它既没有提到
get\u User\u model
东西,也没有提到objects=UserManager()
东西,我无法表达我的感激之情,我的意思是,如果需要,我在哪里可以找到这些信息?事实上,所有信息都在文档中。Django有一个非常完整的文档,但它确实需要时间来找到解决方法。我通常会略读一遍,在心里注意到有一章是关于这个或那个主题的,然后我就回去了。或者简单地通过谷歌搜索:)我是否必须使用信号将新的定制用户与原始用户模型联系起来?因为我以前在我的个人资料模型中使用信号来与用户模型相对应地创建,而现在随着这些变化,我仍然有我的信号,并且仍然命名自定义的用户个人资料,并且应用程序工作得很好,我不明白为什么,不应该有问题或什么吗?不,是原始的用户
模型(Django one)将不再使用,它已被AUTH\u USER\u MODEL=“myapp.USER”替换
设置。这是整个应用程序中用户将使用的模型。但是,如果您有一个生产数据库并引入了该更改,您必须自己进行仔细的数据迁移。非常感谢这一次对我起了很大作用,我想知道为什么文档没有您的答案那么清晰,例如它没有提到n要么是get\u user\u model
对象,要么是objects=UserManager()
事情,我无法表达我有多么感激,我的意思是,如果我需要,我在哪里可以找到这样的信息?事实上,所有信息都在文档中。Django有一份非常完整的文档,但确实需要时间来找到它。我通常会浏览一下,心里注意到有一章关于这个或那个主题,然后我会回去。或者简单地通过谷歌搜索:)我是否必须使用信号将新的定制用户与原始用户模型联系起来?因为我以前在我的个人资料模型中使用信号,以与用户模型相对应地创建,现在通过这些更改,我仍然有我的信号,并且仍然命名自定义的用户个人资料,并且应用程序工作正常,我不在