为什么我在尝试访问HttpRequest.POST['choice']值时遇到类型错误?如何解决此错误?

2024-06-10 21:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直在学习django教程,我被卡住了。在使用post方法提交表单之后,我尝试使用.get()方法获取所选的\u choice模型对象,但得到了一个TypeError:cannot unpackage non iterable ModelBase object错误

以下是视图

from django.shortcuts import render, get_object_or_404

from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import Question, Choice

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(Question, pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {'question': question, 'error_message': 'Please select a choice and vote'})
    else:
        selected_choice.no_of_votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:result', args=(question.id,)))

def result(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/result.html', {'question': question})

以下是模板

  1. 详细信息.html

    
    {% block content_main %}
    
    <h2>{{question.question_text}}</h2>
    {% if error_message %} <strong>{{error_message}}</strong><br><br> {% endif %}
    <form action="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{forloop.counter}}" value="{{choice.id}}" style="margin-left: 20px;">
        <label for="choice{{forloop.counter}}" style="font-size: 20px;">{{choice.choice_text}}</label><br><br>
    {% endfor %} <br>
        <input type="submit" value="vote" style="margin-left: 30px; font-size: 20px;">
    </form>
    
    {% endblock %}
    
  2. result.html


{% block content_main %}
<h2>{{question.question_text}}</h2>
{% for choice in question.choice_set.all %}
    <ul>
        <li>{{choice.choice_text}} -- {{choice.no_of_votes}} vote{{choice.no_of_votes|plural}}</li>
    </ul>
{% endfor %}
<a href="{% url 'polls:detail' question.id %}}">Vote again?</a>
{% endblock %}

我收到以下错误消息

> TypeError at /polls/1/vote cannot unpack non-iterable ModelBase object
> Request Method:   POST Request URL:   http://127.0.0.1:8000/polls/1/vote
> Django Version:   2.2.6 Exception Type:   TypeError Exception Value:  
> cannot unpack non-iterable ModelBase object Exception
> Location: C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\sql\query.py
> in build_filter, line 1187 Python
> Executable:   C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\Scripts\python.exe
> Python Version:   3.7.4 Python Path:  
> ['C:\\Users\\Neeyat\\PycharmProjects\\DjangoApps\\Polls\\mysite', 
> 'C:\\Users\\Neeyat\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip',
> 'C:\\Users\\Neeyat\\AppData\\Local\\Programs\\Python\\Python37\\DLLs',
> 'C:\\Users\\Neeyat\\AppData\\Local\\Programs\\Python\\Python37\\lib', 
> 'C:\\Users\\Neeyat\\AppData\\Local\\Programs\\Python\\Python37', 
> 'C:\\Users\\Neeyat\\PycharmProjects\\DjangoApps\\Polls\\venv', 
> 'C:\\Users\\Neeyat\\PycharmProjects\\DjangoApps\\Polls\\venv\\lib\\site-packages',
> 'C:\\Users\\Neeyat\\PycharmProjects\\DjangoApps\\Polls\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.7.egg',
> 'C:\\Users\\Neeyat\\PycharmProjects\\DjangoApps\\Polls\\venv\\lib\\site-packages\\pip-19.0.3-py3.7.egg']
> Server time:  Wed, 13 Nov 2019 19:22:30 +0000

在终端,

>[14/Nov/2019 00:52:14] "GET / HTTP/1.1" 404 2027 Not
> Found: /favicon.ico [14/Nov/2019 00:52:16] "GET /favicon.ico HTTP/1.1"
> 404 2078 [14/Nov/2019 00:52:24] "GET /polls/ HTTP/1.1" 200 447
> [14/Nov/2019 00:52:27] "GET /polls/1/ HTTP/1.1" 200 1145 Internal
> Server Error: /polls/1/vote Traceback (most recent call last):   File
> "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\core\handlers\exception.py",
> line 34, in inner
>     response = get_response(request)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\core\handlers\base.py",
> line 115, in _get_response
>     response = self.process_exception_by_middleware(e, request)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\core\handlers\base.py",
> line 113, in _get_response
>     response = wrapped_callback(request, *callback_args, **callback_kwargs)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\mysite\polls\views.py",
> line 28, in vote
>     selected_choice = question.choice_set.get(Question, pk=request.POST['choice'])   File
> "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\manager.py",
> line 82, in manager_method
>     return getattr(self.get_queryset(), name)(*args, **kwargs)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\query.py",
> line 399, in get
>     clone = self.filter(*args, **kwargs)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\query.py",
> line 892, in filter
>     return self._filter_or_exclude(False, *args, **kwargs)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\query.py",
> line 910, in _filter_or_exclude
>     clone.query.add_q(Q(*args, **kwargs))   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\sql\query.py",
> line 1290, in add_q
>     clause, _ = self._add_q(q_object, self.used_aliases)   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\sql\query.py",
> line 1318, in _add_q
>     split_subq=split_subq, simple_col=simple_col,   File "C:\Users\Neeyat\PycharmProjects\DjangoApps\Polls\venv\lib\site-packages\django\db\models\sql\query.py",
> line 1187, in build_filter
>     arg, value = filter_expr TypeError: cannot unpack non-iterable ModelBase object [14/Nov/2019 00:52:30] "POST /polls/1/vote HTTP/1.1"
> 500 102541

我刚刚开始与后端网络开发,我找不到一个解决方案,这在任何地方。请帮我解决这个问题。先谢谢你


Tags: djangoinpyvenvlibpackagessiteusers
1条回答
网友
1楼 · 发布于 2024-06-10 21:20:52

只是你的views.py中的一个小错误:

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice']) # <  here
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {'question': question, 'error_message': 'Please select a choice and vote'})
    else:
        selected_choice.no_of_votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:result', args=(question.id,)))

choice_set中查找对象时,不再需要指定模型本身

相关问题 更多 >