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 に答える