django - 我是否在 django 中以错误的方式重写了模型上的保存方法?

标签 django django-models

我有一个 Profile 模型,它可以像这样扩展用户模型,

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 字段,因此我重写了保存方法以将 slug 包含为用户名。问题是,当我使用命令 createsuperuser 创建一个新用户并打印出您在代码中看到的用户名时,它不会显示任何内容 - 它不会显示提供的用户名。这可能是我有 this problem 的原因吗? ?如果是这样,我该如何解决它?

最佳答案

如果您确定不希望将用户的个人资料数据放在带有 OneToOneField 的单独模型中返回 Django 的默认 User,那么您可能应该子类 AbstractUser 而不是 User,如文档中所指定。

https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#substituting-a-custom-user-model

考虑这部分:

If you’re entirely happy with Django’s User model and you just want to add some additional profile information, you could simply subclass django.contrib.auth.models.AbstractUser and add your custom profile field [...]

(来自 https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#extending-django-s-default-user )

然后你会像这样:

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_USER_MODEL

AUTH_USER_MODEL = "myapp.User"  # also, add 'myapp' to INSTALLED_APPS

记住:您需要像这样引用您的 User 模型(无论如何,无论您是否自定义该模型,您都应该这样做):

from django.contrib.auth import get_user_model

User = get_user_model()

关于django - 我是否在 django 中以错误的方式重写了模型上的保存方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894254/

相关文章:

python - 什么类型的选项适用于 SlugField?

django - 如何使用 FileField 将编辑后的内容正确保存到文件中?

django - STATIC_URL不起作用

python - 如何在 Django 中创建集成多个应用程序的网站主页?

python - 在 Django 中将 Self 定义为多个属性

django admin fieldsets - 添加相关模型的字段

python - Django 模型中的新字段未显示在管理界面或模型表单中

python - 自动将登录用户附加到他/她创建的帖子中

python-3.x - 如何更改 Django REST 框架中 URL 中的默认搜索查询参数?

python - 将 ValidationError 提升为字典时出错