我有一个模板,用于在一对多关系中保存两个模型。在这个模板中,我有两个问题,第一个问题有单选选项,第二个问题有复选框选项,如下图所示。例如,当我选择问题 1 中的选项#1 并选中问题 2 中的复选框#1 时,会发生什么情况,表单已成功保存。但是,如果我在问题 1 中选择 choice#3 并在问题 2 中选中 checkbox#1 或 checkbox#2,那么我会收到一个错误:CheckChoice 匹配查询不存在。我不知道为什么我会收到这个错误。
class Survey(models.Model):
title = models.CharField(max_length=200)
created_at = models.DateTimeField(default=timezone.now)
archive = models.CharField(max_length=200, default='')
def __str__(self):
return self.title
class Question(models.Model):
survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
enter_question = models.CharField(max_length=900)
def __str__(self):
return self.enter_question
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.CharField(max_length=100)
class CheckChoice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_check = models.CharField(max_length=100)
class SurveyAnswer(models.Model):
orig_survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
class QuestionAnswer(models.Model):
answer = models.ForeignKey(Choice, on_delete=models.CASCADE)
check_answer = models.ForeignKey(CheckChoice, on_delete=models.CASCADE)
survey_answer = models.ForeignKey(SurveyAnswer, on_delete=models.CASCADE)
def survey_fill(request):
ans = SurveyAnswer()
orig_survey = Survey.objects.get(id=request.POST['survey_id'])
ans.orig_survey = orig_survey
ans.save()
questions = orig_survey.question_set.all()
for question in questions:
qc = request.POST['question' + str(question.id)]
qa = QuestionAnswer()
qa.answer = Choice.objects.get(id=int(qc))
qa.check_answer = CheckChoice.objects.get(id=int(qc))
qa.survey_answer = ans
qa.save()
ans.save()
return render(request, 'survey-complete.html', {})
<div class="d-flex flex-column">
<form method = "post" action ="{% url 'fill-survey' %}">
<input type = "hidden" name = "survey_id" value = {{survey.id}}>
{% csrf_token %}
{% for question in questions %}
<div class="p-2">
<h4 class="header">
Question {{ forloop.counter }}: {{ question.enter_question }}
</h4>
</div>
{% for choice in question.choice_set.all%}
<div class="p-2">
<input type="radio" name ="question{{question.id}}" value={{choice.id}}>
{{choice.choice}}
</div>
{% endfor %}
{% for choice in question.checkchoice_set.all%}
<div class="p-2">
<input type="checkbox" name ="question{{question.id}}" value={{choice.id}}>
{{choice.choice_check}}
</div>
{% endfor %}
{% endfor %}
<div class="p-2">
<input type = "submit" value = "Complete!" class = "btn btn-lg btn-success">
</div>
</form>
更新视图和模板
<div class="d-flex flex-column">
<form method = "post" action ="{% url 'fill-survey' %}">
<input type = "hidden" name = "survey_id" value = {{survey.id}}>
{% csrf_token %}
{% for question in questions %}
<div class="p-2">
<h4 class="header">
Question {{ forloop.counter }}: {{ question.enter_question }}
</h4>
</div>
{% for choice in question.choice_set.all%}
<div class="p-2">
<input type="radio" name ="question{{question.id}}" value={{choice.id}}>
{{choice.choice}}
</div>
{% endfor %}
{% for choice in question.checkchoice_set.all%}
<div class="p-2">
<input type="checkbox" name ="checkbox{{question.id}}" value={{choice.id}}>
{{choice.choice_check}}
</div>
{% endfor %}
{% endfor %}
<div class="p-2">
<input type = "submit" value = "Complete!" class = "btn btn-lg btn-success">
</div>
</form>
def survey_fill(request):
ans = SurveyAnswer()
orig_survey = Survey.objects.get(id=request.POST['survey_id'])
ans.orig_survey = orig_survey
ans.save()
questions = orig_survey.question_set.all()
for question in questions:
if 'question' and 'checkbox' in request.POST:
qc = request.POST['question' + str(question.id)]
check = request.POST['checkbox' + str(question.id)]
qa = QuestionAnswer()
# qa1 = QuestionAnswer()
qa.answer = Choice.objects.get(id=int(qc))
qa.check_answer = CheckChoice.objects.get(id=int(check))
qa.survey_answer = ans
qa.save()
# qa1.survey_answer = ans
# qa1.save()
ans.save()
return render(request, 'survey-complete.html', {})
答案 0 :(得分:0)
我认为您误解了复选框元素的使用。
您的第一个错误是为所有这些设置了相同的名称。他们必须有不同的名字。
你要明白一个checkbox对应的参数只有在勾选的时候才会提交。
复选框元素就像一面旗帜。当它被检查时,它就打开了(并且将被提交)。但是当它没有被检查时,它就会关闭(并且不会被提交)。
我认为在服务器端,您可能收到的值不是有效 ID(整数),然后您会收到“匹配查询不存在”错误。