我正在尝试构建Django博客,问题是,当新用户注册时,直到它以博客作者的身份添加到博客中之后,它才出现在添加博客部分中。
这是我的模特:
from django.db import models
from django.contrib.auth.models import User
class Author(models.Model):
name = models.ForeignKey(User, on_delete=models.CASCADE)
profile_picture = models.FileField()
detail = models.TextField()
def __str__(self):
return self.name.username
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
body = models.TextField()
image = models.FileField()
posted_on = models.DateTimeField(auto_now=False, auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True, auto_now_add=False)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
def __str__(self):
return self.title
我在这里显示我的管理员:
这是我的文章发布表格:
我需要一个仅在名称部分(第三个屏幕截图)中显示并注册的用户登录
即使是在名称部分出现问题,它也要求我将用户注册为博客作者名称,但是我不需要这个。我需要所有注册用户都必须进入文章名称部分,只有他们登录后才能发布
答案 0 :(得分:0)
问题在于,人们注册时会创建一个新的User
,而不是一个新的Author
。解决此问题的最佳方法是通过Author
使User
成为OneToOneField
的扩展名。为简单起见,让我们将Author
重命名为UserProfile
,并在每次访问配置文件时自动为UserProfile
生成一个User
。这意味着您可以编写user.userprofile
以获得有关用户的所有其他信息。
这是一个例子:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofileAsUser') # TODO: Use models.PROTECT... can't currently bc User.userprofile generates it again when trying to delete User
profile_picture = models.FileField()
detail = models.TextField()
def __str__(self):
return self.name.username
def get_or_create_profile(user):
profile, created = UserProfile.objects.get_or_create(user=user)
return profile
User.userprofile = property(get_or_create_profile)
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
body = models.TextField()
image = models.FileField()
posted_on = models.DateTimeField(auto_now=False, auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True, auto_now_add=False)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
def __str__(self):
return self.title