如何在django中为博客创建类似的功能

问题描述 投票:0回答:1

我必须为我的国际象棋俱乐部建立一个博客,我想为帖子制作一个类似的功能。当用户喜欢帖子时,类似的计数增加并且其在用户简档中显示。

这是我到目前为止所做的:

这是我的帖子模型:

class Post(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    content = HTMLField()
    is_aproved = models.BooleanField(default=False)
    # comment_count = models.IntegerField(default = 0)
    # view_count = models.IntegerField(default = 0)
    slug = models.SlugField(unique=True, blank=True)
    likes = models.ManyToManyField(
        settings.AUTH_USER_MODEL, blank=True, related_name='post_likes')
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    thumbnail = models.ImageField()
    categories = models.ManyToManyField(Category)
    featured = models.BooleanField()
    previous_post = models.ForeignKey(
        'self', related_name='previous', on_delete=models.SET_NULL, blank=True, null=True)
    next_post = models.ForeignKey(
        'self', related_name='next', on_delete=models.SET_NULL, blank=True, null=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={
            'id': self.id
        })

    def get_update_url(self):
        return reverse('post-update', kwargs={
            'id': self.id
        })

    def get_delete_url(self):
        return reverse('post-delete', kwargs={
            'id': self.id
        })

    @property
    def get_comments(self):
        return self.comments.all().order_by('-timestamp')

    @property
    def comment_count(self):
        return Comment.objects.filter(post=self).count()

    @property
    def view_count(self):
        return PostView.objects.filter(post=self).count()

这是我的观点:

def post(request, id):
    category_count = get_category_count()
    most_recent = Post.objects.order_by('-timestamp')[:3]
    post = get_object_or_404(Post, id=id)

    if request.user.is_authenticated:
        PostView.objects.get_or_create(user=request.user, post=post)

    form = CommentForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            form.instance.user = request.user
            form.instance.post = post
            form.save()
            return redirect(reverse("post-detail", kwargs={
                'id': post.pk
            }))
    context = {
        'form': form,
        'post': post,
        'most_recent': most_recent,
        'category_count': category_count,
        'form': form
    }
    return render(request, 'post.html', context)

你能帮我实现这个功能吗?

python django
1个回答
0
投票

你需要另一个模型才能在Django中获得喜欢的功能。创建一个这样的模型 -

class PostLikes(models.Model):
    user = models.ForeignKey(User)
    post = models.ForeignKey(Post)
    created = models.DateTimeField(auto_now_add=True)

然后创建一个视图,将实例添加到PostLikes模型中 -

def like_others_post(request, post_id):
    new_like, created = PostLikes.objects.get_or_create(user=request.user, 
                                                   post_id=post_id)
    if not created:
        # you may get and delete the object as the user may already liked this 
        post before

我们使用get或create来避免重复喜欢。因此,用户可以多次单击,但是,类似的实例仅存储一次。

然后在Post模型中添加一个方法来获取喜欢的数量 -

def Post(models.Model):
    ...
    ...
    @property
    def view_count(self):
        return PostLikes.objects.filter(post=self).count()

要查看当前用户是否已经喜欢所显示的帖子,请在帖子视图中查看 -

def post(request, id):
    ....
    ....
    already_liked = PostLikes.objects.filter(user=request.user, post=post).count()
    if number_of_likes > 0:
        already_liked = True # pass this variable to your context
    else:
        already_liked = False # you can make this anything other than boolean

然后使用Javascript和{{already_liked}},在模板中更改类似按钮的动画。

© www.soinside.com 2019 - 2024. All rights reserved.