django 在一对多关系上保存两个模型

时间:2021-06-10 21:59:56

标签: django django-templates

我有一个模板,用于在一对多关系中保存两个模型。在这个模板中,我有两个问题,第一个问题有单选选项,第二个问题有复选框选项,如下图所示。例如,当我选择问题 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', {})

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为您误解了复选框元素的使用。

您的第一个错误是为所有这些设置了相同的名称。他们必须有不同的名字。

你要明白一个checkbox对应的参数只有在勾选的时候才会提交。

复选框元素就像一面旗帜。当它被检查时,它就打开了(并且将被提交)。但是当它没有被检查时,它就会关闭(并且不会被提交)。

我认为在服务器端,您可能收到的值不是有效 ID(整数),然后您会收到“匹配查询不存在”错误。