【问题标题】:Django save a series of question and its corresponding answer set to databaseDjango将一系列问题及其对应的答案集保存到数据库
【发布时间】:2021-07-24 16:13:11
【问题描述】:

我是 Django 的新手,我正在开发测验功能。 我给用户一个创建测验的界面。它基于多步骤形式。我输入了一定数量的问题,然后点击下一步。它显示了我设置问题的字段数量。每个问题有 4 个答案,我使用单选按钮选择正确的答案。问题是当我点击提交按钮时,我不知道如何在我的视图中检索它们。就像我希望每个问题及其相应的答案正确存储在各自的模型中一样。请问各位可以吗?它很长但很容易掌握,有些细节可能会被忽略,因为它们只是字段:)

这是我的代码:

models.py

class PsychometricTest(models.Model):
     DIFF_CHOICES = (
         ('easy', 'easy'),
         ('medium', 'medium'),
         ('hard', 'hard'),
     )
     internship = models.ForeignKey(Internship, on_delete=models.CASCADE)
     name = models.CharField(max_length=120)
     description = models.TextField()
     number_of_questions = models.IntegerField()
     time = models.IntegerField(help_text="Duration of the quiz in minutes")
     required_score_to_pass = models.IntegerField(help_text="required score in %")
     difficulty = models.CharField(max_length=6, choices=DIFF_CHOICES)
     created = models.DateTimeField(auto_now_add=True)
     scheduled_date_time = models.DateTimeField()

     def __str__(self):
         return self.name+" - "+self.topic
 
    def get_questions(self):
         return self.question_set.all()

 class Question(models.Model):
     text = models.CharField(max_length=200)
     psychometric_test = models.ForeignKey(PsychometricTest, on_delete=models.CASCADE)
     created = models.DateTimeField(auto_now_add=True)

     def __str__(self):
          return self.text
 
     def get_answers(self):
         return self.answer_set.all()

 class Answer(models.Model):
    test = models.CharField(max_length=200)
    correct = models.BooleanField(default=False)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return "Question: "+self.question.text+", answer: "+self.text+", correct: "+self.correct

 class Result(models.Model):
     psychometric_test = models.ForeignKey(PsychometricTest, on_delete=models.CASCADE)
     student = models.ForeignKey(StudentUser, on_delete=models.CASCADE)
     score = models.FloatField()
 
     def __str__(self):
        return self.student.user.username+": "+self.psychometric_test+", score="+self.score

add_test.html

    <form style="margin-top: 20px;" action="{% url 'add_test' internship.id  %}" 
     id="add_test_form" method="POST" >
        <!--This form will contain the quiz information-->
        {% csrf_token %}
        <div class="step_div first" style="display: none;">

        <label>Number of questions</label>
                        <input type="number" class="form-control" name="test_num_questions" 
        id="num_qu" min="1" oninput="validity.valid||(value='')"  >

     <script>
       $('#num_qu').on('change', function(){
       var num_of_qu = $('#num_qu').val();
       var html = "";

       for (var i = 1; i <= num_of_qu; i++) {
           html += `<div class="row"><div class="form-row"><div class="form-group col-md-6">
           <label>Name of question</label><input type="text" class="form-control" 
           name="question_text" placeholder="Question"></div></div></div>`;
        
            for (j = 1; j < 5; j++) {
            //4 answers
               html += `<div class="row">
               <div class="form-row">
               <div class="form-group col-md-4">
               <input type="text" class="form-control" name="answers_${j}" id="answer_${j}"
               placeholder="Answer"><input
               type="radio"
               name="answer_for_qu${i}"
               id="answer_${j}">
               </div>
               </div>
               </div>`
       
    }
}
    
    $(".step_div.second").html(html);
  });

views.py

def add_test(request, pid):
    if not request.user.is_authenticated:
        messages.warning(request, "Please login first")
        return redirect('login')

    if request.method == 'POST':
        test_name = request.POST['test_name']
        test_description = request.POST['test_desc']
        test_num_questions = request.POST['test_num_questions']
        test_duration = request.POST['test_duration']
        test_threshold = request.POST['test_threshold']
        test_diff_level = request.POST['test_diff_level']
        test_datetime = request.POST['test_datetime']

    # print(test_name)
    # print(test_description)
    # print(test_num_questions)
    # print(test_duration)
    # print(test_threshold)
    # print(test_diff_level)
    # print(test_datetime)
    
 internship = Internship.objects.get(id=pid)
 context = {
    'internship': internship,
  }
  return render(request, 'add_test.html', context)

【问题讨论】:

    标签: javascript python django django-models django-views


    【解决方案1】:

    第二次编辑:

    class SetData(APIView):
        def post(self, request):
            q_num = request.GET.get('q_num', False)
            for i in range(int(q_num)):
                question=Question(text=request.POST['question_text_{}'.format(i)])
                question.save()
    
                for j in range(4)
                    Answer(
                    text=request.POST['answers_{}_{}].format(i, j),
                            question=question,
                    ...).save()
    

    这是您通过请求传递问题总数的方式:

    <form action="{% url 'add_test' internship.id  %}?p_num=set this with js" method="POST" >
    

    要使用 js 设置 q_num,您需要选择“表单元素”并编辑它的操作。类似:

    <form action="{% url 'add_test' internship.id  %}" method="POST" >
    
    ...
    
    document.getElementById("add_test_form").action += '?q_num=' + num_of_qu;
    

    您无需更改您的网址。


    第一次编辑:

    我无法帮助您使用 javascript,但这是您从 django 中的帖子请求中获取数据的方式: (这是基于类的视图,与基于函数的视图没有太大区别。)

    class SetData(APIView):
        def post(self, request):
            test_num_questions = 
            request.POST['test_num_questions']
            # or if for example you wanna check if a submit input
            # (name='mysubmit') is clicked (in this case, you're
            # not sure if request.POST['test_num_questions']
            # returns True or error:
            
            mysubmit = 
            request.POST.get('mysubmit', False)
            # returns False if it there's no
            # request.POST['mysubmit']
    

    顺便说一句,你为什么不使用django forms 或者更好的django model forms

    【讨论】:

    • 这个我知道。问题是如何检索所有问题及其答案。例如问题 1 及其 4 个答案,问题 2 及其 4 个答案,...
    • 我对 django 表单不满意 :((
    • 相信我,他们很棒!序列化器更好,因为您不必处理前端! `=) 只需写下你能理解的关于你的观点的内容,我们就可以从那里开始。
    • 我从很多偷窥者那里听说过。仍然无法使用:/ 好的,我会发布我的观点
    • 添加了视图部分
    猜你喜欢
    • 2022-11-30
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2023-01-20
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多