2013-02-19 91 views
3

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

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

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

当我点击提交,我有这样的

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

的POST对象我如何遍历以规范的方式得分?

我试图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

签出内置的[RadioSelect](https://docs.djangoproject.com/en/dev/ref/forms/widgets/)小部件。 – yuwang 2013-02-19 02:39:31

+0

在这种情况下,RadioSelect小部件将如何帮助我? – 2013-02-19 02:42:03

+0

我有同样的问题。你有没有找到解决问题的办法? – 2015-03-04 02:56:28

回答

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('-') 
+0

这肯定是比我的工作更好的解决方案。 – 2013-02-19 06:14:48

+0

我刚刚添加了另一个替代方法,如果页面上有很多其他输入类型(可以节省执行多个.startswith调用),这可能更可取。 – 2013-02-19 06:31:07

+0

会不会有相同的名称,只会让我在所有问题中选择一个选项? – 2013-02-19 07:54:42

2

您使用的是PHP主义输入score[{{quiz.id}}]。不要这样做。只需将它们全部叫做score,并且您的浏览器将把它们都放在相同的POST值中,然后通过request.POST.getlist('score')即可获得正确的结果。

+1

问题是我需要根据不同的问题对答案进行分组,单名如何让我选择不同问题的答案? – 2013-02-19 18:00:11