RipKB24
RipKB24

Reputation: 53

Django, Python: cannot unpack non-iterable int object

I have tried to figure this out by looking at the same questions asked by others but I could not figure it out by looking at their questions. Is it something wrong with the vote views of is it something else.enter image description here

The problem is everytime I hit the vote/submit button I get this error can someonne explain the reason for this.

views.py

    class QuizView(DetailView):
    model = Question
    template_name = 'Quizzes/quiz.html'
    
 
   
    
    
class ResultsView(generic.DetailView):
    model = Question
    template_name = 'JSUMA/results.html'
    

def vote(request, question_id):
    question = get_object_or_404(Question, question_id)
    try:
        selected_answer = question.answer_set.get(pk=request.POST['answer'])
    except (KeyError,Answer.DoesNotExist):

        return render(request, 'Quizzes/quiz.html', {'question':question,
        'error_message' : "You didn't select an answer.",})
    else:
        selected_answer.ans += 1
        selected_answer.save()
            
        return HttpResponseRedirect(reverse('JSUMA:', args=(question.id)))

models.py

class User(models.Model):
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    #password = models.CharField(max_length=25)
    email = models.EmailField(max_length=100)

class Quiz(models.Model):
    name = models.CharField(max_length=200,primary_key=True)
    NOQ = models.IntegerField(default=1)
    
   
    

    class Meta:
        verbose_name = "Quiz"
        verbose_name_plural = "Quizzes"
    
    def __str__(self):
        return self.name
    #number Of Questions
class Major(models.Model):  
    major = models.CharField(max_length=200)
    ans = models.IntegerField(default=0)
    answer = models.ManyToManyField('Answer')
    def __str__(self):
        return self.major

class Question(models.Model):
    question_text = models.CharField(max_length=400)
    quiz = models.ForeignKey("Quiz", on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.question_text


class Answer(models.Model):
    question = models.ForeignKey('Question', on_delete=models.CASCADE, null=True)
    answer_text = models.CharField(max_length=200)


    def __str__(self):
         return self.answer_text

quiz.html

<h1><h1>{{ question.question_text }}</h1></h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'JSUMA:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for answer in question.answer_set.all %}
        <input type="radio" name="answer" id="answer{{ forloop.counter }}" value="{{ answer.id }}" />
        <label for="answer{{ forloop.counter }}">{{answer.answer_text }}</label><br />
    {% endfor %}
    <input type="submit" value="Vote" />
    </form>

Upvotes: 1

Views: 964

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476709

If you use positional parameters in a get_object_or_404, this is for a Q object. Otherwise you should use named parameters:

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    # …

Upvotes: 1

Related Questions