Как создать подобную функциональность в django для блога

#python #django

#python #django

Вопрос:

Мне нужно создать блог для моего шахматного клуба, и я хотел бы создать подобную функциональность для постов. Когда пользователю нравится публикация, количество лайков увеличивается, и публикация отображается в профиле пользователя.

Вот что я сделал на данный момент:

Это моя модель публикации:

 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)
  

не могли бы вы помочь мне реализовать подобную функциональность

Ответ №1:

Вам нужна другая модель, чтобы получить понравившуюся функциональность в 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, чтобы избежать дублирования лайков. Таким образом, пользователь может щелкнуть несколько раз, но экземпляр like сохраняется только один раз.

затем добавьте метод в модель публикации для получения количества лайков-

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

Чтобы узнать, нравится ли текущему пользователю уже отображаемый пост или нет, в вашем представлении post-

 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}} измените анимацию кнопки «Нравится» в вашем шаблоне.