Только хотите, чтобы пользователь «лайкнул» комментарий один раз. Мой код не работает - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть модель Post, в которой есть поле likes_total. Я только хочу, чтобы пользователь мог понравиться сообщение один раз, но код для этого в представлении не работает. вот код:

views.py

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)
    likers = []

    if request.method == 'POST':
        if request.user in likers:
            return render(request, 'groups/detail.html', {'group':group, 'error': "you have already liked this post"} )
        else:
            post.likes_total += 1
            post.save()
            likers.append(request.user)
            return redirect('/groups/' + str(group_id) )
        # post.save()
    else:
        return render(request, 'groups/detail.html', {'group':group})

этот код мне кажется правильным, не могу сказать, в чем проблема .. любая помощь будет очень признательна!

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Ваш список likers не сохраняется нигде и всегда инициализируется пустым списком, поэтому request.user никогда не будет в списке.

Вы должны отредактировать свою модель так, чтобы у каждого из ваших Post объектов был список пользователей, которым он понравился, а затем вы можете сохранить, обновить и проверить этот список, чтобы убедиться, что каждому пользователю нравится каждое сообщение не более одного раза.

0 голосов
/ 30 апреля 2018

Вы определяете список с именем likers в функции like. Это означает, что каждый раз, когда кто-то вызывает функцию like, вы создаете новый и пустой список.

Вы можете создать список вне функции, но это тоже не поможет. Фактически единственные данные, которые вы можете считать постоянными (данные, которые вы можете вставить / изменить / удалить так, чтобы при следующем вызове были обнаружены эти различия), находятся в базе данных.

В результате вы должны позволить базе данных хранить людей, которым нравится публикация, например, добавив ManyToManyField к модели Post, которая относится к пользователям, которые любили публиковать сообщения. Таким образом, вы должны отредактировать модель:

class Post(Model):

    <b>likers = ManyToManyField(User)</b>
    # some other fields
    likes_total = IntegerField()

Теперь мы можем добавить пользователя, которому нравится этот пост, в отношение «многие ко многим»:

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)

    if request.method == 'POST':
        if request.user in <b>post.likers.all()</b>:
            return render(request, 'groups/detail.html', {'group':group, 'error': "you have already liked this post"} )
        else:
            post.likes_total += 1
            <b>post.likers.add(request.user)</b>
            post.save()
            return redirect('/groups/' + str(group_id) )
    else:
        return render(request, 'groups/detail.html', {'group':group})

Еще одно улучшение, которое вы можете сделать, - это использовать reverse для генерации URL-адресов вместо того, чтобы создавать URL-адреса самостоятельно.

0 голосов
/ 30 апреля 2018

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

...