Как создать подобный функционал в django для блога - PullRequest
0 голосов
/ 30 марта 2019

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

Вот что я сделал до сих пор:

Это моя модель сообщения:

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 Ответ

0 голосов
/ 30 марта 2019

Вам нужна другая модель, чтобы получить приятную функциональность в 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 и {{Уже_ликированный}}, измените анимацию кнопки «Мне нравится» в своем шаблоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...