【问题标题】:Return more than one id in django在 django 中返回多个 id
【发布时间】:2012-07-27 05:07:32
【问题描述】:

所以我把 django-polls 教程带到了一个简单的博客中。有些帖子通过外键链接到他们的民意调查。我遇到的问题是,当我“投票”或单击“再次投票”时,它会重新加载帖子,但会使用投票的 ID 重新加载。

例子:

post1 - linked to - poll1
post2 - no poll
post3 - linked to - poll2

所以当我在 post3 中投票或再次点击投票时,它会加载 post2。

我需要获取帖子的 ID 和投票。

这是我的代码: 模型.py:

class Post(models.Model):
    title = models.CharField(max_length=60)
    description = models.CharField(max_length=200)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def display_mySafeField(self):
        return mark_safe(self.body)

    def __unicode__(self):
        return self.title

class Poll(models.Model):
    question = models.CharField(max_length=200)
    total_votes = models.DecimalField(default=0.0, max_digits=5, decimal_places=2)
    post = models.ForeignKey(Post)
    voted = models.BooleanField(default=False)

    def __unicode__(self):
        return self.question


# Choice for the poll
class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.DecimalField(default=0.0, max_digits=5, decimal_places=2)
    percentage = models.DecimalField(default=0.0, max_digits=5, decimal_places=2)

    def __unicode__(self):
        return self.choice

views.py:

def vote(request, poll_id):
    global choice
    p = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the poll voting form.
        return render_to_response('post.html', {
            'poll': p,
            'error_message': "You didn't select a choice.",
            }, context_instance=RequestContext(request))
    else:
        selected_choice.votes += 1
        p.total_votes += 1
        selected_choice.save()
        p.voted = True
        p.save()

        choices = list(p.choice_set.all())
        for choice in choices:
            percent = choice.votes*100/p.total_votes
            choice.percentage = percent
            choice.save()

        return HttpResponseRedirect(reverse("blog.views.post", args=[poll_id]))

def vote_again(request, post_pk):
    try:
        p = get_object_or_404(Poll, pk=post_pk)
    except (KeyError, Poll.DoesNotExist):
    # Redisplay the poll voting form.
        return render_to_response('post.html', {
        'poll': p,
        'error_message': "You didn't select a choice.",
        }, context_instance=RequestContext(request))
    else:
        p.voted = False
        p.save()
    return HttpResponseRedirect(reverse("blog.views.post", args=[post_pk]))

urls.py:

url(r'^revote/(\d+)/$', 'blog.views.vote_again'),
url(r'^polls/(?P<poll_id>\d+)/vote/$', 'blog.views.vote'),

这一切都适用于第一个帖子和投票,但是当我想向没有相同 pk 的帖子添加投票时它会崩溃。

任何帮助或指导将不胜感激。我已经搞砸了大约 2 个小时,这是 django 第一次让我感到沮丧。提前道歉,因为我 99% 确定这是一个愚蠢的问题。

【问题讨论】:

  • 最好也加上models代码。
  • 刚刚添加了它们。还有,我还没有使用用户,只有我可以投票和重新投票。
  • def vote_again(request, post_pk) 语义上,您传递的是 post_pk 但正在查询 Poll 模型。这是故意的吗?
  • 我尝试了 p = get_object_or_404(Post, pk=poll_id) 但然后再次投票没有做任何事情,它在第一次投票时的工作方式只是没有帖子/投票没有相同的 pk..我需要投票的 pk,但我需要使用帖子的 pk 重新加载帖子。我的一部分想要使每个投票 pk 等于帖子的 pk。但这与将 poll 模型添加到 post 模型不是一回事吗?
  • 当我点击重新投票时,我得到一个以 /revote/3/ 结尾的网址

标签: python django


【解决方案1】:

pk 表示主键。因此,您正在尝试获取一个 id 与 post_pk 相同的 poll 对象。

试试,

p = get_object_or_404(Poll, post_id=post_pk)

【讨论】:

  • 谢谢,我现在要去撞墙了。 :) 再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2018-09-22
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多