2014-12-19 3 views
0

내가 가진 모델 필드에서 값을 얻을 모델 :장고는

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 ??

아무도 나를 도울 수 있습니까 ??? 사물의

+0

목록 색인이 범위를 벗어나는 이유 : 쿼리 세트가 결과를 반환하지 않기 때문에 – Anentropic

+0

"일반 사용자가 로그인하지 않았거나 일반 사용자가 아닌 경우 투표하면 사용자 개체에 특성이 없음 is_general_user"이 표시됨 ... 예, 명백하게 – Anentropic

답변

0

몇 최적화 :

대신 사용 get_object_or_404(Question, id=pk) 더 나은

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

의.

if request.user.is_authenticated(): 
    if request.user.is_general_user: 
     #.... 

이러한 방법으로, 당신은 당신이 인증 된 사용자 및하지와 함께 연주되어 있는지 확인하십시오 : 당신은 당신이 if request.user.is_general_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]

업데이트 : 나는 실제로 컨텍스트에 들어가기를 원하지 않습니다. 방금 버그를 수정하려고했습니다.

+0

'request.user.question_set.values_list ("vote", flat = True) .filter (pk = pk)'는 OP가 코딩 한 것을 잘 번역 한 것입니다. OP가 달성하고자하는 것의 맥락. (특정 항목은 이미'ques = Question.objects.get (id = pk)'에 의해 이미 검색되었다.) ... 나는 OP가 정말로 원했던 것은'Question.objects.exclude (user = request.user))' – Anentropic

+0

@Anentropic 오, 네가 맞아 .. – doniyor

+1

나에게 도움이 된 고맙습니다. – gamer