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