为什么我在尝试访问 HttpRequest.POST['choice'] 值时收到 TypeError?我该如何解决这个错误?
Why am I getting a TypeError while trying to access HttpRequest.POST['choice'] value? How do I solve this error?
最近一直在学习django教程,卡住了。使用 post 方法提交表单后,我尝试使用 .get() 方法获取 selected_choice 模型对象,但出现 TypeError: cannot unpack 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})
这是模板
detail.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 %}
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
我刚刚开始后端 Web 开发,但我找不到任何解决方案。这个你能帮我吗。提前谢谢你。
只是你的一个小错误 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
中查找对象时,您不再需要指定 模型 本身。
最近一直在学习django教程,卡住了。使用 post 方法提交表单后,我尝试使用 .get() 方法获取 selected_choice 模型对象,但出现 TypeError: cannot unpack 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})
这是模板
detail.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 %}
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
我刚刚开始后端 Web 开发,但我找不到任何解决方案。这个你能帮我吗。提前谢谢你。
只是你的一个小错误 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
中查找对象时,您不再需要指定 模型 本身。