Python Django order_将queryset随机化两次?

Python Django order_将queryset随机化两次?,python,django,sqlite,Python,Django,Sqlite,我正在尝试为我正在工作的程序随机设置一个查询集 这就是我的观点。py full_quiz = Quiz.objects.get(name=quiz_name).questions.all() form = TheForm(full_quiz) if request.method == "POST": form = QuestionForm(request.GET, full_quiz) 这就是我表格中的内容 class QuestionForm(forms.Form): def __i

我正在尝试为我正在工作的程序随机设置一个查询集

这就是我的观点。py

full_quiz = Quiz.objects.get(name=quiz_name).questions.all()
form = TheForm(full_quiz)
if request.method == "POST":
    form = QuestionForm(request.GET, full_quiz)
这就是我表格中的内容

class QuestionForm(forms.Form):
def __init__(self, questions, *args, **kwargs):
    super(QuestionForm, self).__init__(*args, **kwargs)
    for i in range(len(questions)): 
        if questions[i].answer.count() < 2:
            self.fields["field_name %d" % i] = forms.CharField(label=questions[i], required=False)
课堂提问表(forms.Form):
定义初始值(自我、问题、*args、**kwargs):
超级(问题形式,自我)。\uuuuu初始值(*args,**kwargs)
对于范围内的i(len(问题)):
如果问题[i]。回答。计数()<2:
self.fields[“field\u name%d”%i]=forms.CharField(label=questions[i],required=False)
从我的测试来看,似乎查询集正在与第二个表单变量随机化。有什么办法吗


谢谢

您可以获得如下所述的随机订单查询集:

您尚未发布表单的代码,但我希望QuestionForm是一个模型表单集。通过设置queryset参数,可以更改ModelFormSet的queryset(请参阅):

假设您有一个这样的模型结构

class Quiz(models.Model):

    name = models.CharField('Quizname', max_length=200)
    questions = models.ManyToManyField('Question')

class Answer(models.Model):

    reply = models.CharField('Answer', max_length=100)

class Question(models.Model):

    the_question = models.CharField('Question', max_length=100)
    answers = models.ManyToManyField('Answer', related_name='answers')
    correct_answer = models.ForeignKey('Answer', on_delete=models.CASCADE)

    def is_correct(self, given_answer):
        return given_answer == self.correct_answer
您可以使用
ModelForm
ModelFormSet
创建表单结构:

class QuestionForm(forms.ModelForm):
    myanswers = forms.ModelChoiceField(queryset=Answer.objects.all(), widget=forms.RadioSelect, required=False)
    class Meta:
        model = Question
        fields = ('the_question', 'myanswers')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['myanswers'].queryset = self.instance.answers.all()


QuestionFormSet = modelformset_factory(Question, form=QuestionForm, extra=0)
并在视图中使用它:

def myview(request, quiz_name):

  if request.method == 'POST':
      formset = QuestionForm(request.POST)
      if form.is_valid():
          allanswers = [f['id'].is_correct(f['myanswers']) for f in formset.cleaned_data]
          print('Number of correct answers:', sum(allanswers))

  fullquiz = Quiz.objects.get(name=quiz_name).questions.order_by('?')
  formset = QuestionForm(queryset=fullquiz)
  return render(request, 'yourtemplate.html', {'formset': formset })

为什么要添加request.GET数据到表单中?在检查方法是否为“POST”后?当我发出request.POST请求时,我遇到了以下错误:MultiValueDictKeyError。请提供有关您尝试实现的内容和表单代码的更多详细信息。我正在尝试进行测验,然后用户可以提交答案。但现在我正在努力使测验的问题变得杂乱无章,而不是按同样的顺序排列。不确定这是否正确,但我在view.py中处理了测验的分数。只是为了澄清一下:您试图显示一个页面,用户在其中看到一个表单集,其中包含某个特定测验的所有问题,这些问题以某种随机顺序排列?在回答问题并提交表单集后,答案将被保存?感谢您的回复。我添加了设置forms.py的方法。@user8802333您为什么不在问题表单中使用ModelFormSet?我使用的方法是我找到的唯一一种收集清理数据的方法(使用字段_name#)。我不知道如何使用ModelFormSet执行此操作。@user8802333请在编辑的回答中查看我的建议谢谢您的回答。不幸的是,在我这方面似乎不起作用。
class QuestionForm(forms.ModelForm):
    myanswers = forms.ModelChoiceField(queryset=Answer.objects.all(), widget=forms.RadioSelect, required=False)
    class Meta:
        model = Question
        fields = ('the_question', 'myanswers')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['myanswers'].queryset = self.instance.answers.all()


QuestionFormSet = modelformset_factory(Question, form=QuestionForm, extra=0)
def myview(request, quiz_name):

  if request.method == 'POST':
      formset = QuestionForm(request.POST)
      if form.is_valid():
          allanswers = [f['id'].is_correct(f['myanswers']) for f in formset.cleaned_data]
          print('Number of correct answers:', sum(allanswers))

  fullquiz = Quiz.objects.get(name=quiz_name).questions.order_by('?')
  formset = QuestionForm(queryset=fullquiz)
  return render(request, 'yourtemplate.html', {'formset': formset })