3

我正在实现一个测验应用程序,并且正在使用单选按钮显示多项选择答案。

我需要对每个问题的答案进行分组,所以我有这样的

{% for answer in quiz.quizanswer_set.all %}
<p><input type="radio" name="score[{{quiz.id}}]" value="{{answer.score}}"/>{{answer.answer}}</p>
{% endfor %}

当我点击提交时,我有这样的 POST 对象

<QueryDict: {u'score[1]': [u'10'], u'score[3]': [u'10'], u'score[2]': [u'10'], u'Get Result': [u'Submit']}>

如何以规范的方式遍历分数?

我试过request.POST.getlist('score')了,它返回空列表

PS。quiz.id 可能不是按顺序排列的,它来自数据库的行 id。

我目前的工作是:

for quiz in Quiz.objects.all():
        total_score += int(request.POST.get('score[{0}]'.format(quiz.id)))
4

2 回答 2

3

只需过滤 POST 键:

for score_key in filter(lambda key:key.startswith('score'), request.POST.keys()):

    total_score += int(request.POST[score_key])

更新

考虑一下,列表理解会比过滤器更好:

for score_key in [key for key in request.POST.keys() if key.startswith('score[')]:

   total_score += int(request.POST[score_key])

更新 2

我一直在研究的另一种方法是保持每个单选按钮的名称相同(例如分数),然后将测验 id 与值合并:

<input type="radio" name="score" value="{{quiz.id}}-{{answer.score}} /> 

然后,您可以轻松获取所有分数的列表并拆分值:

for value in request.POST['score']:
    quiz_id, score = value.split('-')
于 2013-02-19T05:09:28.790 回答
2

您通过命名输入来使用 PHP 主义score[{{quiz.id}}]。不要那样做。只需调用它们score,您的浏览器就会做正确的事情,将它们都放在相同的 POST 值中,然后您可以通过该值获取request.POST.getlist('score')

于 2013-02-19T09:45:16.723 回答