Python Django-使用inline保存和更新表单集
我有一个TestingQuestion和TestingQuestion选项类。 创建测试问题时,我也使用StackedLine创建测试问题选项。 目前,创建新的TestingQuestion以及TestingQuestionOptions可以正常工作。 我遇到的问题是,当我想保存我已经创建的测试问题时。ie尝试编辑并保存更改。 我在这一行出现“列表索引超出范围”错误Python Django-使用inline保存和更新表单集,python,django,formset,inline-formset,Python,Django,Formset,Inline Formset,我有一个TestingQuestion和TestingQuestion选项类。 创建测试问题时,我也使用StackedLine创建测试问题选项。 目前,创建新的TestingQuestion以及TestingQuestionOptions可以正常工作。 我遇到的问题是,当我想保存我已经创建的测试问题时。ie尝试编辑并保存更改。 我在这一行出现“列表索引超出范围”错误 "question = saved_options[0].question" 它位于“TestingQuestionFormS
"question = saved_options[0].question"
它位于“TestingQuestionFormSet”类下的“保存现有对象”方法中
返回None,我不知道为什么,因为我希望它返回TestingQuestionOption。
任何帮助都将不胜感激。谢谢
这是密码
models.py
class TestingQuestion(models.Model):
class TestingQuestionOption(models.Model):
question = models.ForeignKey(TestingQuestion, null=True, blank=False)
管理员
class TestingQuestionOptionInline(admin.StackedInline, SummernoteInlineModelAdmin):
model = TestingQuestionOption
formset = TestingQuestionFormSet
class TestingQuestionAdmin(SummernoteModelAdmin, ImportExportModelAdmin):
form = TestingQuestionCreateForm
inlines = (TestingQuestionOptionInline,)
forms.py
class TestingQuestionFormSet(forms.models.BaseInlineFormSet):
def save_new_objects(self, commit=True):
saved_options = super(TestingQuestionFormSet, self).save_new_objects(commit)
if commit:
question = saved_options[0].question
for option in saved_options:
if option.order == 0:
option.order = TestingQuestionOption.objects.filter(question=question).count() + 1
if option.name == "Auto Generated":
option.name = "%s Option %s" % (question, option.order)
option.save()
if len(saved_options) < 2:
order = TestingQuestionOption.objects.filter(question=question).count() + 1
name = "%s Option %s" % (question, order)
TestingQuestionOption.objects.create(name=name, order=order, question=question, correct=False)
return saved_options
def save_existing_objects(self, commit=True):
saved_options = super(TestingQuestionFormSet, self).save_existing_objects(commit)
if commit:
question = saved_options[0].question
for option in saved_options:
if option.order == 0:
option.order = TestingQuestionOption.objects.filter(question=question).count() + 1
if option.name == "Auto Generated":
option.name = "%s Option %s" % (question, option.order)
option.save()
if len(saved_options) < 2:
order = TestingQuestionOption.objects.filter(question=question).count() + 1
name = "%s Option %s" % (question, order)
TestingQuestionOption.objects.create(name=name, order=order, question=question, correct=False)
return saved_options
class TestingQuestionCreateForm(forms.ModelForm):
def save(self, commit=True):
testing_question = super(TestingQuestionCreateForm, self).save(commit=False)
if testing_question.order == 0 or testing_question.name == "Auto Generated":
count = TestingQuestion.objects.filter(module__id=self.data.get("module")).count() + 1
module = Module.objects.get(id=self.data.get("module"))
name = "%s Question %d" % (module, count)
while TestingQuestion.objects.filter(name=name):
count += 1
name = "%s Question %d" % (module, count)
testing_question.name = name
testing_question.order = count
testing_question.save()
question_content = self.cleaned_data.get("question_content")
testing_question.question_content = process_mathml_content(question_content, 0, testing_question.id)
answer_content = self.cleaned_data.get("answer_content")
testing_question.answer_content = process_mathml_content(answer_content, 1, testing_question.id)
testing_question.save()
return testing_question
class Meta:
model = TestingQuestion
class TestingQuestionFormSet(forms.models.BaseInlineFormSet):
def save_new_对象(self,commit=True):
saved_options=super(TestingQuestionFormSet,self)。保存新对象(提交)
如果提交:
问题=已保存的\u选项[0]。问题
对于保存的_选项中的选项:
如果option.order==0:
option.order=TestingQuestionOption.objects.filter(question=question.count()+1
如果option.name==“自动生成”:
option.name=“%s option%s”%(问题,option.order)
option.save()
如果len(已保存的_选项)<2:
order=TestingQuestionOption.objects.filter(question=question.count()+1
name=“%s选项%s”%(问题,顺序)
TestingQuestionOption.objects.create(name=name,order=order,question=question,correct=False)
返回保存的\u选项
def save_现有_对象(self,commit=True):
saved_options=super(TestingQuestionFormSet,self)。保存现有对象(提交)
如果提交:
问题=已保存的\u选项[0]。问题
对于保存的_选项中的选项:
如果option.order==0:
option.order=TestingQuestionOption.objects.filter(question=question.count()+1
如果option.name==“自动生成”:
option.name=“%s option%s”%(问题,option.order)
option.save()
如果len(已保存的_选项)<2:
order=TestingQuestionOption.objects.filter(question=question.count()+1
name=“%s选项%s”%(问题,顺序)
TestingQuestionOption.objects.create(name=name,order=order,question=question,correct=False)
返回保存的\u选项
类TestingQuestionCreateForm(forms.ModelForm):
def save(self,commit=True):
testing_question=super(TestingQuestionCreateForm,self).save(commit=False)
如果测试\u question.order==0或测试\u question.name==“自动生成”:
count=TestingQuestion.objects.filter(module\u id=self.data.get(“module”)).count()+1
module=module.objects.get(id=self.data.get(“module”))
name=“%s问题%d”%(模块,计数)
测试question.objects.filter(name=name)时:
计数+=1
name=“%s问题%d”%(模块,计数)
测试_question.name=名称
测试问题顺序=计数
测试_question.save()
question\u content=self.cleanned\u data.get(“question\u content”)
testing\u question.question\u content=process\u mathml\u content(question\u content,0,testing\u question.id)
answer\u content=self.cleanned\u data.get(“answer\u content”)
testing\u question.answer\u content=process\u mathml\u content(answer\u content,1,testing\u question.id)
测试_question.save()
返回测试问题
类元:
模型=测试问题
class TestingQuestionFormSet(forms.models.BaseInlineFormSet):
def save_new_objects(self, commit=True):
saved_options = super(TestingQuestionFormSet, self).save_new_objects(commit)
if commit:
question = saved_options[0].question
for option in saved_options:
if option.order == 0:
option.order = TestingQuestionOption.objects.filter(question=question).count() + 1
if option.name == "Auto Generated":
option.name = "%s Option %s" % (question, option.order)
option.save()
if len(saved_options) < 2:
order = TestingQuestionOption.objects.filter(question=question).count() + 1
name = "%s Option %s" % (question, order)
TestingQuestionOption.objects.create(name=name, order=order, question=question, correct=False)
return saved_options
def save_existing_objects(self, commit=True):
saved_options = super(TestingQuestionFormSet, self).save_existing_objects(commit)
if commit:
question = saved_options[0].question
for option in saved_options:
if option.order == 0:
option.order = TestingQuestionOption.objects.filter(question=question).count() + 1
if option.name == "Auto Generated":
option.name = "%s Option %s" % (question, option.order)
option.save()
if len(saved_options) < 2:
order = TestingQuestionOption.objects.filter(question=question).count() + 1
name = "%s Option %s" % (question, order)
TestingQuestionOption.objects.create(name=name, order=order, question=question, correct=False)
return saved_options
class TestingQuestionCreateForm(forms.ModelForm):
def save(self, commit=True):
testing_question = super(TestingQuestionCreateForm, self).save(commit=False)
if testing_question.order == 0 or testing_question.name == "Auto Generated":
count = TestingQuestion.objects.filter(module__id=self.data.get("module")).count() + 1
module = Module.objects.get(id=self.data.get("module"))
name = "%s Question %d" % (module, count)
while TestingQuestion.objects.filter(name=name):
count += 1
name = "%s Question %d" % (module, count)
testing_question.name = name
testing_question.order = count
testing_question.save()
question_content = self.cleaned_data.get("question_content")
testing_question.question_content = process_mathml_content(question_content, 0, testing_question.id)
answer_content = self.cleaned_data.get("answer_content")
testing_question.answer_content = process_mathml_content(answer_content, 1, testing_question.id)
testing_question.save()
return testing_question
class Meta:
model = TestingQuestion