Как получить данные базы данных на основе выпадающего выбранного значения в Django?

#django

#django

Вопрос:

Я загрузил вопросы в базу данных с выпадающими значениями, такими как PAPER1, PAPER2 и т. Д., На моей странице шаблона, если я нажму на PAPER1, я должен получить только вопросы PAPER1. Как получить такие данные? пожалуйста, помогите мне.

models.py:

 class Questions(models.Model):
        paper = models.CharField(max_length=10, default='None')
        qs_no = models.IntegerField(default=None)
        question = models.TextField(max_length=500)
        option_a = models.CharField(max_length=100)
        option_b = models.CharField(max_length=100)
        option_c = models.CharField(max_length=100)
        option_d = models.CharField(max_length=100)
        ans = models.CharField(null=True, max_length=50)
 

forms.py:

 PAPER_CHOICES = (
    ('default', 'None'),
    ('paper1','PAPER1'),
    ('paper2','PAPER2'),
    ('paper3','PAPER3'),
    ('paper4','PAPER4'),
    ('paper5','PAPER5'),
    ('paper6','PAPER6'),
    ('paper7','PAPER7'),
    ('paper8','PAPER8'),
    ('paper9','PAPER9'),
    ('paper10','PAPER10'),
)



class QuestionsForm(forms.ModelForm):
    paper = forms.CharField(widget=forms.Select(choices = PAPER_CHOICES))
    class Meta:
        model=Questions
        fields=[
            'paper',
            'qs_no',
            'question',
            'option_a',
            'option_b',
            'option_c',
            'option_d',
            'ans',
        ]
 

views.py:

 def render_questions(request):
    print(f'user in render_questions is {request.user.username}', flush=True)
    if not request.user.is_authenticated:
       return render(request, 'login.html')
    else:
        global exam_session
        exam_session = ''.join(random.choice(string.ascii_uppercase   string.digits) for _ in range(10))
        print(f"session id in render ques is {exam_session}", flush=True)
        questions = Questions.objects.all()
        ques = []
        qs_no = 1
        for q in questions:
            que = {}
            que['qs_no'] = qs_no
            qs_no = qs_no   1
            que['question'] = q.question
            que['id'] = q.id
            que['option_a'] = q.option_a
            que['option_b'] = q.option_b
            que['option_c'] = q.option_c
            que['option_d'] = q.option_d
            ques.append(que)
        print(f"ques: {ques}", flush=True)
        return render(request, 'report.html', {'ques': ques})
 

template.html:

 <form id="myform" name="myform" action="answer" method="POST">
         {% csrf_token %}
         <div class="questionContainer">
            {% for question in ques %}
             <div class="questiondiv" data-questionId="{{ question.id }}">
              <div class="bghead1">
               <h5><strong>Question amp;nbsp;amp;nbsp;{{ question.qs_no }}.</strong></h5>
             </div>
              <div class="font mrl">
                <h5><input type="hidden" class="form-check-input" name="question" value="{{ question.question }}">{{ question.question }}</h5>
              </div>
               <div class="radio pad">
                 <label><input type="radio" class="form-check-input" name="question{{question.qs_no}}" value="{{question.option_a}}">amp;nbsp;amp;nbsp;amp;nbsp;A)amp;nbsp;amp;nbsp;{{ question.option_a }}</label>
               </div>
               <div class="radio pad">
                 <label><input type="radio" class="form-check-input" name="question{{question.qs_no}}" value="{{question.option_b}}">amp;nbsp;amp;nbsp;amp;nbsp;B)amp;nbsp;amp;nbsp;{{ question.option_b }}</label>
               </div>
               <div class="radio pad">
                 <label><input type="radio" class="form-check-input" name="question{{question.qs_no}}" value="{{question.option_c}}">amp;nbsp;amp;nbsp;amp;nbsp;C)amp;nbsp;amp;nbsp;{{ question.option_c }}</label>
               </div>
               <div class="radio pad">
                <label><input type="radio" class="form-check-input" name="question{{question.qs_no}}" value="{{question.option_d}}">amp;nbsp;amp;nbsp;amp;nbsp;D)amp;nbsp;amp;nbsp;{{ question.option_d }}</label>
              </div>
            </div>
           {% endfor %}
        </div>

     </form>
 

В этом шаблоне, если я нажму на paper1 и т. Д., Я должен получить вопросы, связанные с paper 1.

Papers.html:

 <div class="container">
 <table class="table">

  <tbody>
    <tr>
      <td>RRB NTPC</td>
      <td><a href=''>Mock Test Paper 1</a></td>
    </tr>
    <tr>
      <td>RRB NTPC</td>
      <td><a href=''>Paper 2</a></td>
    </tr>
</tbody>
 </table>
</div>
 

шаблон вопросов:

 <form action="questions" method="POST">
    {% csrf_token %}
   <div class="container">
     <h3>Upload Questions:</h3><br>
      <div class="form-group row">
           <div class="col-sm-4">
              {{ form.as_p }}
              <button type="submit">Upload</button>
           </div>
      </div>
   </div>
</form>
 

Комментарии:

1. покажите шаблон с помощью QuestionsForm, вам нужно выполнить последующий вызов формы выбора бумаги, а затем перехватить идентификатор бумаги в серверной части и передать его в запрос фильтра вопросов

2. @danish_wani — Привет, я загрузил шаблон вопросов. Пожалуйста, проверьте и предложите. Спасибо

3. Поправьте меня, если я ошибаюсь, поэтому вы хотите, чтобы в этом шаблоне вопросов при выборе любого документа из выпадающего списка такие поля, как ‘qs_no’, ‘question’, ‘option_a’, ‘option_b’, ‘option_c’, ‘option_d’, ‘ans’, должны обновляться и показывать только вопросыпринадлежность к документу, выбранному в раскрывающемся списке

4. Да, вы правы, именно так мне и нужно. На основе выбранного выпадающего списка я должен получить вопросы, связанные с документом.

Ответ №1:

Вместо этого используйте бумажную форму:

forms.py

 class PaperForm(forms.ModelForm):
    paper = forms.CharField(widget=forms.Select(choices = PAPER_CHOICES))
 

paper.html

 <form action="questions" method="POST">
        {% csrf_token %}
       <div class="container">
         <h3>Upload Questions:</h3><br>
          <div class="form-group row">
               <div class="col-sm-4">
                  {{ form.as_p }}
                  <div id="questions_section">
                      {% include 'questions.html' %}
                  </div>
                  <button type="submit">Upload</button>
               </div>
          </div>
       </div>
    </form>


<script>
   $('body').on('change', "select[name='paper']", function(){
       $( "select[name='paper'] option:selected" ).each(function() {
        paper = $( this ).val();
       });
       
       
       $.ajax({
        type: "GET",
        url: '/get_questions',
        data: {'paper': paper},
        success: function(response) {
            $('#questions_section').html(response);
        },
        error: function() {
            alert('Error occurred');
        }
       });
   });

</script
 

questions.html

 <ul>
    {% for question_obj in questions %}
    <li>
        {{ forloop.counter }}. question_obj.question
    </li>
    <li>
        <input type="radio" name="question_no" value="{{question_obj.qs_no}}">
      <label>{{question_obj.option_a}}</label>
    </li>
    <li>
        <input type="radio" name="question_no" value="{{question_obj.qs_no}}">
      <label>{{question_obj.option_b}}</label>
    </li>
    <li>
         <input type="radio" name="question_no" value="{{question_obj.qs_no}}">
      <label>{{question_obj.option_c}}</label>
    </li>
    <li>
         <input type="radio" name="question_no" value="{{question_obj.qs_no}}">
      <label>{{question_obj.option_d}}</label>
    </li>
    {% endfor %}
</ul>
 

views.py

 def get_questions(request):
    if request.method == 'GET':
        paper = request.GET.copy().get('paper')
        context = dict()
        if paper and Questions.objects.filter(paper=paper).exists:
           context['questions'] = Questions.objects.filter(paper=paper)
        return render(request, 'questions.html', context)