我有一个 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/