How can i make shuffle in django Forms?

huangapple go评论92阅读模式
英文:

How can i make shuffle in django Forms?

问题

我有一个类似于问答游戏的项目,但我需要在问题中对答案进行随机排序。

这是我的代码:

template.html

  1. <form method="post">
  2. {% csrf_token %}
  3. <h3>{{ current_question.text }}</h3>
  4. {{ form.selected_answer }}
  5. <button type="submit">Next</button>
  6. </form>

views.py

  1. if request.method == 'POST':
  2. form = QuestionForm(request.POST, question=current_question)
  3. if form.is_valid():
  4. user_answer = form.cleaned_data['selected_answer']
  5. user_test.useranswer_set.update_or_create(question=current_question,
  6. defaults={'selected_answer': user_answer})
  7. return redirect('test', test_id=test_id)
  8. else:
  9. form = QuestionForm(question=current_question)

这是我的Django表单。我尝试了这样的方式,但它不起作用:

  1. from django import forms
  2. from .models import Answer
  3. import random
  4. from django.db.models.query import QuerySet
  5. class QuestionForm(forms.Form):
  6. selected_answer = forms.ModelChoiceField(
  7. queryset=Answer.objects.none(),
  8. widget=forms.RadioSelect,
  9. empty_label=None
  10. )
  11. def __init__(self, *args, question=None, **kwargs):
  12. super().__init__(*args, **kwargs)
  13. if question:
  14. answers = list(question.answer_set.all())
  15. random.shuffle(answers)
  16. self.fields['selected_answer'].queryset = answers
英文:

I have got a project like quiz. But i need to shuffle the answers in questions.
here is my code:
template.html

  1. &lt;form method=&quot;post&quot;&gt;
  2. {% csrf_token %}
  3. &lt;h3&gt;{{ current_question.text }}&lt;/h3&gt;
  4. {{ form.selected_answer }}
  5. &lt;button type=&quot;submit&quot;&gt;Next&lt;/button&gt;
  6. &lt;/form&gt;

views.py

  1. if request.method == &#39;POST&#39;:
  2. form = QuestionForm(request.POST, question=current_question)
  3. if form.is_valid():
  4. user_answer = form.cleaned_data[&#39;selected_answer&#39;]
  5. user_test.useranswer_set.update_or_create(question=current_question,
  6. defaults={&#39;selected_answer&#39;: user_answer})
  7. return redirect(&#39;test&#39;, test_id=test_id)
  8. else:
  9. form = QuestionForm(question=current_question)

There is my django form. I try like this but it doesn't work:

  1. from django import forms
  2. from .models import Answer
  3. import random
  4. from django.db.models.query import QuerySet
  5. class QuestionForm(forms.Form):
  6. selected_answer = forms.ModelChoiceField(
  7. queryset=Answer.objects.none(),
  8. widget=forms.RadioSelect,
  9. empty_label=None
  10. )
  11. def __init__(self, *args, question=None, **kwargs):
  12. super().__init__(*args, **kwargs)
  13. if question:
  14. answers = list(question.answer_set.all())
  15. random.shuffle(answers)
  16. self.fields[&#39;selected_answer&#39;].queryset = answers

答案1

得分: 1

如果答案的数量很少,这里可能是这种情况,你可以使用.order_by('?')来处理。

  1. class QuestionForm(forms.Form):
  2. selected_answer = forms.ModelChoiceField(
  3. queryset=Answer.objects.none(), widget=forms.RadioSelect, empty_label=None
  4. )
  5. def __init__(self, *args, question=None, **kwargs):
  6. super().__init__(*args, **kwargs)
  7. if question:
  8. self.fields[
  9. 'selected_answer'
  10. ].queryset = question.answer_set<b>.order_by('?')</b>
英文:

If the number of answers is small, which is likely the case here, you can work with .order_by(&#39;?&#39;)&nbsp;<sup>[Django-doc]</sup>:

<pre><code>class QuestionForm(forms.Form):
selected_answer = forms.ModelChoiceField(
queryset=Answer.objects.none(), widget=forms.RadioSelect, empty_label=None
)

  1. def __init__(self, *args, question=None, **kwargs):
  2. super().__init__(*args, **kwargs)
  3. if question:
  4. self.fields[
  5. &#39;selected_answer&#39;
  6. ].queryset = question.answer_set&lt;b&gt;.order_by(&#39;?&#39;)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;

huangapple
  • 本文由 发表于 2023年8月8日 20:06:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/76859397.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定