2013-02-19 89 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