Django和单选按钮

时间:2013-02-19 02:32:22

标签: django loops radio

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

我需要按问题对答案进行分组,所以我就这样了

{% 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)))

2 个答案:

答案 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])

更新2

我一直在研究的另一种方法是保持每个单选按钮的名称相同(例如得分),然后将测验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')获取它。