2012-08-08 51 views
-1

我做了一个简单的博客和django民意调查教程。我试图让他们一起工作。当我加载一篇文章时,与它相关的投票加载,投票再次工作,但当我点击一个选项,然后投票按钮,它加载与民意调查ID的ID。林不知道,如果我的“投票”功能的意见,我的“投票”网址,或我的模板搞砸了?这里是我的代码:将django民意调查教程应用程序添加到其他应用程序

models.py:

# Post class 
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 

# Poll for the Post 
class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    total_votes = models.IntegerField(default=0) 
    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.IntegerField(default=0) 
    percentage = models.DecimalField(default=0.0, max_digits=5, decimal_places=2) 

    def __unicode__(self): 
     return self.choice 

urls.py:

urlpatterns = patterns('', 
    ### main/index page 
    url(r'^$', 'blog.views.main', name='index'), 

    ### url for the post.html 
    url(r'^post/(\d+)', 'blog.views.post'), 

    ### polls 
    url(r'^polls/(\d+)/results/$', 'blog.views.results'), 
    url(r'^polls/(\d+)/vote/$', 'blog.views.vote'), 
    url(r'^revote/(\d+)/$', 'blog.views.vote_again'), 

) 

views.py:

# main view for the posts 
def main(request): 
    posts = Post.objects.all().order_by("-created") 
    paginator = Paginator(posts, 5) 

    try: page = int(request.GET.get("page", '1')) 
    except ValueError: page = 1 

    try: 
     posts = paginator.page(page) 
    except (InvalidPage, EmptyPage): 
     posts = paginator.page(paginator.num_pages) 
    d = dict(posts=posts, user=request.user, 
      post_list=posts.object_list, months=mkmonth_lst()) 

    return render_to_response("list.html", d) 

def post(request, pk): 
    post = Post.objects.get(pk=int(pk)) 
    comments = Comment.objects.filter(post=post) 
    try: 
     poll = Poll.objects.get(post=post) 
    except Poll.DoesNotExist: 
     poll = None 
    d = dict(post=post, comments=comments, form=CommentForm(), user=request.user, 
      months=mkmonth_lst(), poll=poll) 
    d.update(csrf(request)) 
    return render_to_response("post.html", d) 


#view to vote on the poll 
def vote(request, post_id): 
    global choice 
    p = get_object_or_404(Poll, pk=post_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=[post_id ])) 

def vote_again(request, post_pk): 
    try: 
     p = get_object_or_404(Poll, post_id=post_pk) 
    except (KeyError, Poll.DoesNotExist): 
     pass 
    else: 
     p.voted = False 
     p.save() 
    return HttpResponseRedirect(reverse("blog.views.post", args=[post_pk])) 

这是正在发生的事情:

post1 - linked to - poll1 
post2 - not linked 
post3 - linked to - poll2 

当我投票关于链接到post3的poll2时,它更新poll2的数据库,但它重新加载post2而不是post3。

+2

你可以是任何更具体?你是否在所有可能不适用的范围内缩小范围?你有什么尝试?你有没有在调试器'pdb'中放入代码?你必须帮助我们一点点来帮助你! – dm03514 2012-08-09 00:00:15

+1

我不确定你在这里遇到的确切问题。此外,它无法加载您的整个代码库。 – 2012-08-09 00:00:36

+0

我试着将pk,poll_pk,poll_id,post pk传递给视图函数,有时候我会得到一个错误,但是它的工作时间还剩余时间,但是重新载入了有投票的id的帖子。 – lciamp 2012-08-09 01:04:26

回答

1

在您的HTML表单中,您的操作设置为/polls/{{ poll.id }}/vote/。但是,它正在寻找post.pk值,而不是poll.pk。它使用该值在提交数据后重新加载页面。那应该是你的问题。

编辑

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=[ p.post.pk ]) 
+0

这就给了我一个404“没有民意调查匹配给定的查询”这是我一直在获得除了加载投票的ID的职位。 – lciamp 2012-08-09 01:36:05

+1

这是因为在你的'vote()'视图中你使用'post_id'来查询一个Poll。 – 2012-08-09 01:37:08

+0

谢谢,如果我原来的问题不明确,我很抱歉。我很感激你帮助我。 – lciamp 2012-08-09 02:19:05