Как реализовать подобную систему в Django шаблонах - PullRequest
1 голос
/ 13 июля 2020

В настоящее время я работаю над созданием системы «лайков» для веб-сайта в стиле блога в Django. Я просмотрел несколько различных примеров настройки шаблонов HTML и надеялся лучше понять некоторые логики c.

Моей первой мыслью было ie «нравится» кнопку в соответствующем представлении, например:

<a class="btn btn-secondary" href="{% url 'post-like' post.id %}" role="button">Like ({{ post.likes.count }})</a>

Кажется, это работало прилично («лайки» регистрировались и отображались в подсчете), но у меня возникли проблемы с возвращением на нужную страницу после нажатия кнопку «нравится» (т.е. когда я нажимал кнопку «нравится», меня переходили на другую страницу, а не оставалось на домашней странице).

Затем я нашел другой пример в Интернете, который создал функцию get_like_url() под более широкий Post Model вот так:

def get_like_url(self):
        return reverse("post-like", kwargs={"pk":self.id})

И затем назвал его в шаблоне вот так:

<a class="btn btn-secondary" href="{{ instance.get_like_url }}" role="button">Like ({{ post.likes.count }})</a>

Я думал, что это в основном то же самое, но когда я использовал этот метод, он возвращал меня на домашнюю страницу моего сайта, но не регистрировал подобное (т.е. не казалось, что кнопка на самом деле что-то делала).

Может ли кто-нибудь помочь мне понять, что такое goi ng здесь?

Для справки, вот мой View для системы «нравится»:

class LikeView(View):
    model = Post
    context_object_name = 'posts'

    def get(self, request, pk=None):
        user = self.request.user
        post = Post.objects.get(pk=pk)
        updated = False
        liked = False
        if user.is_authenticated:
            if user in post.likes.all():
                liked = False
                post.likes.remove(user)
            else:
                liked = True
                post.likes.add(user)
            updated = True
        data = {
            "updated": updated,
            "liked": liked,
        }
        return HttpResponse(data)

И мой URL pattern:

path('post/like/<int:pk>', LikeView.as_view(), name='post-like')

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 13 июля 2020

Я реализовал это как модель, я не уверен, что это лучший способ сделать это, но у меня он сработал.

class Like(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="likes")
                       
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, 
        related_name="likes")

    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'post'], name="unique_like"),
        ]

Я также использовал уникальные лайки для каждого пользователя в модели используя UniqueConstraint . Вы также можете использовать genericForeignKey для лайков комментариев, заметок и т. Д. c.

@method_decorator(login_required, name='dispatch')
class LikeView(View):
    def get_success_url(self):
        return reverse("posts:detail", kwargs={"pk": self.kwargs.get("pk")})

    def get(self, request, *args, **kwargs):
        like = Like()
        like.post = get_object_or_404(Post, pk=self.kwargs.get("pk"))
        like.user = self.request.user
        like.save()
        return redirect(self.get_success_url())

В шаблоне:

{% if request.user.pk not in post.get_likes_users %}
    <a href="{% url 'posts:like' pk=post.pk %}">
        <i class="fa fa-thumbs-up"></i>
        Like
    </a>
{% else %}
    /* dislike implementation*/
{% endif %}
...