Django模型和博客作者权限问题

时间:2019-03-10 19:11:32

标签: django

我正在尝试构建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

我在这里显示我的管理员:

enter image description here

这是我的文章发布表格:

enter image description here

我需要一个仅在名称部分(第三个屏幕截图)中显示并注册的用户登录

即使是在名称部分出现问题,它也要求我将用户注册为博客作者名称,但是我不需要这个。我需要所有注册用户都必须进入文章名称部分,只有他们登录后才能发布

enter image description here

1 个答案:

答案 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