我正在实施一个测验应用,我正在使用单选按钮显示多项选择答案。
我需要按问题对答案进行分组,所以我就这样了
{% 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)))
答案 0 :(得分: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])
我一直在研究的另一种方法是保持每个单选按钮的名称相同(例如得分),然后将测验ID与值合并:
<input type="radio" name="score" value="{{quiz.id}}-{{answer.score}} />
然后,您可以轻松获得所有分数的列表并拆分值:
for value in request.POST['score']:
quiz_id, score = value.split('-')
答案 1 :(得分:2)
您通过命名输入score[{{quiz.id}}]
来使用PHP主题。不要那样做。只需将它们全部称为score
,您的浏览器就可以将它们全部放在相同的POST值中,然后通过request.POST.getlist('score')
获取它。