为什么在尝试访问HttpRequest.POST ['choice']值时出现TypeError?如何解决此错误?

问题描述 投票:0回答:1

我最近一直在学习django教程,但遇到了麻烦。使用post方法提交表单后,我尝试使用.get()方法获取selected_choice模型对象,但出现TypeError:无法解压缩不可迭代的ModelBase对象错误。

这里是视图

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. 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 %}
    
  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 %}

并且我收到以下错误消息

/ polls / 1 / vote处的TypeError无法解压缩不可迭代的ModelBase对象请求方法:POST请求URL:http://127.0.0.1:8000/polls/1/voteDjango版本:2.2.6异常类型:TypeError异常值:无法解包不可迭代的ModelBase对象异常位置:C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ sql \ query.py在build_filter中,第1187行Python可执行文件:C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ Scripts \ python.exePython版本:3.7.4 Python路径:['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']服务器时间:2019年11月13日星期三19:22:30 +0000

在终端,

[[14 / Nov / 2019 00:52:14]“ GET / HTTP / 1.1” 404 2027不找到:/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” 200447[14 / Nov / 2019 00:52:27]“ GET / polls / 1 / HTTP / 1.1” 200 1145内部服务器错误:/ polls / 1 / vote追溯(最近一次呼叫最近):文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ core \ handlers \ exception.py”,第34行,在内部response = get_response(request)File“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ core \ handlers \ base.py”,第115行,在_get_response中响应= self.process_exception_by_middleware(e,请求)文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ core \ handlers \ base.py”,_get_response中的第113行响应= wraped_callback(请求,* callback_args,** callback_kwargs)文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ mysite \ polls \ views.py”,第28行,已投票selected_choice = question.choice_set.get(Question,pk = request.POST ['choice'])文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ manager.py”,第82行,在manager_method中返回getattr(self.get_queryset(),name)(* args,** kwargs)文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ query。 py”,399行,进入clone = self.filter(* args,** kwargs)文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ query.py”,过滤器中的第892行返回self._filter_or_exclude(False,* args,** kwargs)文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ query.py”,第910行,在_filter_or_exclude中clone.query.add_q(Q(* args,** kwargs))文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ sql \ query.py ”,第1290行,在add_q中子句,_ = self._add_q(q_object,self.used_aliases)文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ sql \ query.py”,_add_q中的第1318行split_subq = split_subq,simple_col = simple_col,文件“ C:\ Users \ Neeyat \ PycharmProjects \ DjangoApps \ Polls \ venv \ lib \ site-packages \ django \ db \ models \ sql \ query.py”,第1187行,在build_filter中arg,value = filter_expr TypeError:无法解压缩不可迭代的ModelBase对象[14 / Nov / 2019 00:52:30]“ POST / polls / 1 / vote HTTP / 1.1”500 102541

我只是从后端Web开发开始,在任何地方都找不到解决方案。这个你能帮我吗。预先谢谢你。

python django python-3.x django-templates httprequest
1个回答
0
投票

您的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中寻找对象时,不再需要指定model本身。

© www.soinside.com 2019 - 2024. All rights reserved.