Как увеличить целочисленное поле django из представления?

Я создаю веб-приложение Django 1.8.4 для отправки ссылок с функциями голосования за и против. Но каждый раз, когда я нажимаю кнопку голосования, она применяется к последней отправленной ссылке. Я использую формы для этого. Форма вполне нормальная:

class VoteForm(forms.ModelForm):
    class Meta:
        model = Vote
        exclude = ("vote_type", "vote_date",)

вот модель:

class Link(models.Model):
    title       = models.CharField(max_length=200)
    ...
    up_votes    = models.IntegerField(default=0, blank=True, db_index=True)
    down_votes  = models.IntegerField(default=0, blank=True, db_index=True)
    ...

class Vote(models.Model):
    UP, DOWN = range(2)
    TYPE_CHOICES = [(UP, "Upvote"), (DOWN, "DownVote")]

    voter = models.ForeignKey(User)
    link = models.ForeignKey(Link, related_name='votes')
    vote_type = models.IntegerField(choices=TYPE_CHOICES, db_index=True, null=True)
    vote_date = models.DateTimeField(db_index=True, auto_now=True)

и представление обрабатывает голосование: (это все еще так просто и глупо, я думаю)

class VoteFormView(FormView):
    form_class = VoteForm

    def form_valid(self, form):
        link = get_object_or_404(Link, pk=form.data["link"])
        user = self.request.user
        prev_votes = Vote.objects.filter(voter=user, link=link)
        has_voted = (prev_votes.count()>0)

        if not has_voted:
            Vote.objects.get_or_create(voter=user, link=link)
            Link.objects.filter(pk=form.data["link"]).update(up_votes=F('up_votes')+1)
            print("+voted")
        else:
            pass
        return redirect("home")

Идея здесь заключалась в том, чтобы проверить, проголосовал ли текущий пользователь за ссылку, если нет, то увеличить поле up_votes соответствующего объекта ссылки. Но теперь он увеличивает только последний link.object.up_votes.


person sheshkovsky    schedule 02.10.2015    source источник
comment
form.data[ссылка] поставляется с правильным pk?   -  person Paulo Pessoa    schedule 02.10.2015
comment
Похоже, вы ничего не сделали, чтобы привязать форму к конкретной ссылке.   -  person Daniel Roseman    schedule 02.10.2015
comment
Именно в этом проблема. Я добавил print link, и он печатает один и тот же link.title независимо от того, какую кнопку голосования я нажимаю. hoc я могу исправить это сейчас? Я имею в виду, как я могу отправить правильный pk в представление?   -  person sheshkovsky    schedule 02.10.2015
comment
Это была действительно глупая проблема! Я забыл закрыть тег ‹form› в своем шаблоне! поэтому правильный ПК не может быть отправлен! Спасибо, парни.   -  person sheshkovsky    schedule 02.10.2015


Ответы (1)


Как вы можете видеть в комментариях, проблема вызвана неправильным pk, отправленным в представления, и это была моя ошибка, чтобы закрыть тег в моем шаблоне. Просто для записи я вставляю сюда эту часть кода шаблона:

{% for link in object_list %}
<form method="POST" action="{% url 'vote' %}" class="vote_form">
    <li> 
        {% csrf_token %}
        <input type="hidden" id="id_link" name="link" class="hidden_id" value="{{ link.pk }}"/>
        <input type="hidden" id="id_link" name="voter" class="hidden_id" value="{{ user.pk }}"/>
        <button>+</button>
        [{{ link.up_votes }}] 
        <a href="{{ link.url }}">
            <h3>{{ link.title }}</h3>
        </a> 
        <a href="{% url 'link_detail' pk=link.id slug=link.title|slugify %}">
            Comments
        </a>
        <p>
            Submitted by: <a href="{% url 'profile' slug=link.submitter%}"> {{ link.submitter }}</a>
        </p>
    </li>
    </form>
{% endfor %}
person sheshkovsky    schedule 02.10.2015