Python Django order_将queryset随机化两次?
我正在尝试为我正在工作的程序随机设置一个查询集 这就是我的观点。pyPython 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
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 })