【问题标题】:How to increment django integer field from view?如何从视图中增加 django 整数字段?
【发布时间】:2015-12-30 18:50:55
【问题描述】:

我正在创建一个 Django 1.8.4 Web 应用程序来提交具有赞成票和反对票功能的链接。但是每次我点击赞成投票按钮时,它都会应用于最后提交的链接。我正在使用表格来做到这一点。形式很正常:

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。

【问题讨论】:

  • form.data["link"] 是否带有正确的 pk ?
  • 您似乎没有将表单绑定到特定链接。
  • 正是这个问题。我添加了print link,无论我点击哪个投票按钮,它都会打印相同的link.title。我现在可以解决这个问题吗?我的意思是如何将正确的 pk 发送到视图?
  • 真是个愚蠢的问题!我忘了在我的模板中关闭
    标记!所以无法发送正确的pk!谢谢大家。

标签: django python-2.7 django-forms django-views django-database


【解决方案1】:

正如您在 cmets 中看到的那样,错误的 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 %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2014-02-03
    • 2012-05-05
    • 2011-07-09
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多