Django: позволяет пользователю ставить лайк только один раз - PullRequest
0 голосов
/ 19 мая 2019

Только что написал функцию на Django, которая позволяет пользователям голосовать только один раз за пост (ошибка). Как вы увидите, что это было сделано, нажав на ссылку. Просто хотелось бы узнать, можно ли скрыть кнопку «Голосовать» после того, как пользователь проголосовал один раз? Вот код, надеюсь, это поможет:

views.py:

def vote(request, bug_id):
bug = get_object_or_404(BugTable, pk=bug_id)
if request.user.is_authenticated:
    bug.vote += 1
    try:
        Vote.objects.create(bug=bug, user=request.user)
        bug.save()
    except IntegrityError:
        messages.success(request, 'You already voted for this bug')
        return redirect(bugfix)
return render(request, 'detail.html', {'bug': bug})

models.py

class BugTable(models.Model):


author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
bug_name = models.CharField(max_length=50, blank=False)
vote = models.IntegerField(default=0)

def __str__(self):
    return self.bug_name


class Vote(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   bug = models.ForeignKey(BugTable, on_delete=models.CASCADE, 
   related_name='voter')

class Meta:
    unique_together = ('user', 'bug')

detail.html

{% block features %}
  <h5 style="margin-top: 10px;"><strong>{{ bug.bug_name }}</strong></h5>
  <a href="{% url 'vote' bug.id %}">Vote</a>
  {{ bug.vote}}
{% endblock %}

Пробовал с простой функцией jQuery с использованием метода .hide, не сработало. Может быть, есть что-то, что я мог бы использовать, просто введя функцию {% if%}? Спасибо за любой совет

1 Ответ

0 голосов
/ 19 мая 2019

Есть несколько способов сделать это, простейшим было бы рассчитать, если текущий пользователь проголосовал в поле зрения, и указать это в шаблоне:

views.py:

def vote(request, bug_id):
    bug = get_object_or_404(BugTable, pk=bug_id)
    current_user_voted = bug.voter.filter(user=request.user).exists()
    if request.user.is_authenticated:
        bug.vote += 1
        try:
            Vote.objects.create(bug=bug, user=request.user)
            bug.save()
        except IntegrityError:
            messages.success(request, 'You already voted for this bug')
            return redirect(bugfix)
    return render(request, 'detail.html', {'bug': bug, 'current_user_voted': current_user_voted})

details.html:

{% block features %}
    <h5 style="margin-top: 10px;"><strong>{{ bug.bug_name }}</strong></h5>
    {% if not current_user_voted %}
        <a href="{% url 'vote' bug.id %}">Vote</a>
    {% endif %}
    {{ bug.vote }}
{% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...