0
我正在一個web應用程序每當我保存到模型,節省了真/假答案,選擇題的答案相同的模型(答案)如何強制添加不變的Django實例數據庫
class Answer(models.Model):
question = models.ForeignKey(Question, related_name='answers')
correct = models.BooleanField()
a_text = models.CharField(max_length=255, null=True, blank=True)
created = models.DateTimeField(auto_now_add="True")
工作我刪除現有的這個模型的數據,並打算在實例和request.POST從數據重新填充
然後我讀了Django文檔在
save()方法返回已保存到數據庫的實例。如果給定的實例的數據在綁定數據中未更改,則實例將不會保存到數據庫,並且不會包含在返回值(上例中的實例)中。
請幫幫忙,我卡住了。
這裏是我的形式聲明
class AnswerForm(ModelForm):
class Meta:
model = Answer
fields = ['a_text', 'correct']
widgets = {
'correct': RadioSelect(choices=[(True, "True"), (False, "False")])
}
AnswerFormSet = modelformset_factory(
Answer,
fields = ('a_text', 'correct'),
max_num = 4,
min_num = 4)
這是我的看法
def create_question(request, quiz_id, que_id=None):
quiz = get_object_or_404(Quiz, id=quiz_id)
created_questions = Question.objects.filter(quiz=quiz_id)
if que_id:
que_id = int(que_id)
que = get_object_or_404(Question, id=que_id, quiz=quiz)
question_form = QuestionForm(instance=que)
if que.question_type == 'multiplechoice':
multiple_choice_answer_form = AnswerFormSet(
queryset=que.answers.all(),
)
truefalse_answer_form = AnswerForm()
elif que.question_type == 'truefalse':
multiple_choice_answer_form = AnswerFormSet(
queryset=que.answers.none(),
)
for ans_form in que.answers.all():
truefalse_answer_form = AnswerForm(instance=ans_form)
else:
question_form = QuestionForm()
truefalse_answer_form = AnswerForm()
multiple_choice_answer_form = AnswerFormSet(queryset=Answer.objects.none())
if request.method == 'POST':
# import pdb; pdb.set_trace();
if que_id:
question_form = QuestionForm(instance=que, data=request.POST, files=request.FILES)
if que.question_type == 'multiplechoice':
multiple_choice_answer_form = AnswerFormSet(
data=request.POST,
queryset=que.answers.all())
truefalse_answer_form = AnswerForm(data=request.POST)
elif que.question_type == 'truefalse':
multiple_choice_answer_form = AnswerFormSet(data=request.POST, queryset=que.answers.none())
for ans_form in que.answers.all():
truefalse_answer_form = AnswerForm(data=request.POST, instance=ans_form)
else:
question_form = QuestionForm(data=request.POST, files=request.FILES)
truefalse_answer_form = AnswerForm(request.POST)
multiple_choice_answer_form = AnswerFormSet(request.POST, queryset=que.answers.all())
if question_form.is_valid() and truefalse_answer_form.is_valid() and multiple_choice_answer_form.is_valid():
question = question_form.save(commit=False)
question.quiz = quiz
question.save()
que_type = question_form['question_type'].data
if que_type == 'truefalse':
# delete existing data to avoid mixing the True/False and Multiple choice answers
if que_id:
for q in que.answers.all():
q.delete()
truefalse = truefalse_answer_form.save(commit=False)
truefalse.question = question
truefalse.save()
elif que_type == 'multiplechoice':
multiple_choice = multiple_choice_answer_form.save(commit=False)
for multiple_choice_que in multiple_choice:
multiple_choice_que.question = question
multiple_choice_que.save()
if 'save' in request.POST:
print('Saving and Redirecting to edit Section...')
messages.success(request, 'Question saved successfully!')
return redirect('edit_question', quiz_id=quiz_id, que_id=question.id)
elif 'add_new' in request.POST:
question_form = QuestionForm()
truefalse_answer_form = AnswerForm()
messages.success(request, 'Question added successfully!')
print("Add new question")
return redirect('create_question', quiz_id=quiz_id)
else:
messages.error(request, 'An error was encountered!')
return render(request, 'quiz/question/create.html', {'question_form': question_form,
'quiz': quiz,
'que_id': que_id,
'created_questions': created_questions,
'multiple_choice': multiple_choice_answer_form,
'truefalse': truefalse_answer_form })