django从模型字段中获取值

时间:2014-12-19 05:46:14

标签: python django model views

我有模特:

class Question(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=120)
    description = models.TextField()
    category = models.ForeignKey('Category')
    answers = models.ManyToManyField('Answer',related_name='answer_name', blank=True)
    post_date = models.DateTimeField(auto_now=True)
    published = models.BooleanField(default=False)
    vote = models.IntegerField(default=0) # Field that denotes the no of vote for particular question

    def __unicode__(self):
        return self.title

我的观点:

def VoteCountView(request, pk):

    ques = Question.objects.get(id=pk)
    cpk = ques.category.id
    valid_user = ques.user.username

    if request.user.is_general_user:
        if request.user.username == valid_user:
            messages.warning(request, "You cannot vote your own question")
            return redirect("question-detail", pk, cpk)
        else:
            vote_limit = Question.objects.values_list("vote", flat=True).filter(pk=pk).filter(user=request.user)#[0][0]
            print "vote count"
            print vote_limit
            if vote_limit < 1:
                vote_count = ques
                print vote_count.user
                count = vote_count.vote
                count +=1
                vote_count.vote = count
                vote_count.user = request.user
                print vote_count.user
                vote_count.save()
            else:
                messages.warning(request,"You cannot vote twice")
                return redirect("question-detail", pk, cpk)
    else:
        messages.warning(request,"You are not allowed to vote a question")
        return redirect("question-detail", pk, cpk)

这里我想要的是其他用户可以投票问题,除了发布问题的用户。当其他用户投票时,它表示列表索引超出范围。我可以从这个模型中实现这一点,或者我必须为投票制作单独的模型。

另外如果用户没有登录或者没有普遍使用,如果投票它说用户对象没有属性is_general_user ??

任何人都可以帮我吗???

1 个答案:

答案 0 :(得分:0)

要优化的几件事:

而不是

ques = Question.objects.get(id=pk)

更好地使用get_object_or_404(Question, id=pk)。你永远不知道将来会发生什么......

在执行if request.user.is_general_user:之前,您需要检查用户是否经过身份验证:

if request.user.is_authenticated():
    if request.user.is_general_user: 
        #....
通过这种方式,您可以确保使用的是Authenticated User而不是Anonymous User(未登录的用户)。这可能会解决您的其他list index out of range问题,因为您的过滤器中现在request.user是一个同样在db中的已验证的问题。

你也可以用这种更干净的方式编写你的查询:

vote_limit = request.user.question_set.values_list("vote", flat=True).filter(pk=pk)#[0][0]

我不知道[0][0]你的意思,如果想得到最新的问题,你可以这样做:

.order_by('-id')[0]

而不是[0][0]

更新:我没有进入你真正想要的内容。我只是想修复bug。