【问题标题】:How to fetch user selected model fields in django如何在 django 中获取用户选择的模型字段
【发布时间】:2021-08-21 21:35:10
【问题描述】:

我想根据用户输入选择的数据从数据库中获取数据。我正在使用 model_name.objects.all 从该模型中获取所有数据。

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings


class quiztitle(models.Model):

    Quiz_id = models.AutoField(primary_key=True)
    Quiz_title = models.CharField(max_length=600)
    User = settings.AUTH_USER_MODEL
    User_id= models.ForeignKey(User, on_delete=models.CASCADE)
    no_of_ques = models.IntegerField(default=10)


    def __str__(self):
        return self.Quiz_title

class question(models.Model):
    Qid = models.AutoField(primary_key=True)
    User = settings.AUTH_USER_MODEL
    User_id = models.ForeignKey(User,on_delete=models.CASCADE)
    Quiz_id = models.ForeignKey(quiztitle,on_delete=models.CASCADE)
    Qques = models.TextField()
    Qoption1 = models.TextField()
    Qoption2 = models.TextField()
    Qoption3 = models.TextField()
    Qoption4 = models.TextField()
    QAnswer = models.TextField()
    def __str__(self):
        return self.Qques

class answer(models.Model):

    Ansid = models.AutoField(primary_key=True)
    Qid = models.OneToOneField(question,on_delete=models.CASCADE)
    Quiz_id = models.ForeignKey(quiztitle, on_delete=models.CASCADE)
    User = settings.AUTH_USER_MODEL
    User_id = models.ForeignKey(User, on_delete=models.CASCADE)
    Answer = models.TextField()


class result(models.Model):
    result = models.AutoField(primary_key=True)
    Quiz_id = models.OneToOneField(quiztitle, on_delete=models.CASCADE)
    User_id = models.OneToOneField(User, on_delete=models.CASCADE)
    score = models.FloatField()


def __str__(self):
    return str(self.pk)

这是用户选择测验标题以开始测验的 html 文件。通过点击尝试测验按钮,用户可以尝试选择测验。 学生.html

 <div class="Question-container">
     <div>
         {% for x in title %}
         <h1 class="title"><i class="fa fa-circle" id="quiz-icon" ></i>{{x.Quiz_title}}<button onclick="window.location.href='/sample'">Attempt Quiz</button></h1>
         {% endfor %}
    </div>

 </div>

主要问题->sample.html(这里要获取student.html中列出的所选quiz_title的数据)

<body>
    <div class="topnav">
        <div class="topnav-right">
          <a href="{% url 'home' %}" class="aa">Home</a>
          <a href="{% url 'logout' %}" class="aa">Logout  </a>
        </div>
    </div>

<div class="leftbar">
    <div>
        {% for x in title %}
        <h1 class="title">{{x.Quiz_title}}</h1>
        <input type="hidden" id="Quiz_id" value="{{x.Qid}}">
         {% endfor %}
    </div>

    {% for x in ques %}
        <h1 class="question" >Q. {{x.Qques}}</h1>
        <input type="hidden" id="Qid" value="{{x.Qid}}">

    <form method="post">
        {% csrf_token %}
        <div class="radio"><label><input type="radio" id="option1"  name="name" value="{{x.Qoption1}}">{{x.Qoption1}}</label></div>
        <div class="radio"><label><input type="radio" id="option2"  name="name" value="{{x.Qoption2}}">{{x.Qoption2}}</label></div>
        <div class="radio"><label><input type="radio" id="option3"  name="name" value="{{x.Qoption3}}">{{x.Qoption3}}</label></div>
        <div class="radio"><label><input type="radio" id="option4"  name="name" value="{{x.Qoption4}}">{{x.Qoption4}}</label></div>


    {% endfor %}
    <div class="form-group">
        <button type="submit" class="btn btn-success"  id="save_ans">Save</button>
    </div></form>
    <div class="paginator">
   <div class="form-group">
       {% if ques.has_previous %}
       <a href="?page={{ques.previous_page_number}}"><button class="btn-back" id="submitAnswer">Back</button></a>
       {% endif %}
       {% if ques.has_next %}
       <a href="?page={{ques.next_page_number}}"><button class="btn-next" id="submitAnswer">Next</button></a>
       {% else %}
       <a href="/result/"><button type="submit" class="btn  btn-success" id="submitAnswer">Submit Quiz</button></a>
       {% endif %}
   </div>

我想获取数据,即问题以及用户选择的测验标题选项但是 question.objects.all() 给出了存储在表中的所有问题。请帮助我改进逻辑。

views.py

def handle_res(request):
myuser = User.objects.all()
title = quiztitle.objects.all()
ques = question.objects.all()
if request.method == 'POST':
    Answer = request.POST.get('ans')
    print("Answer",Answer)
    Quiz_id = request.POST.get('Quiz_id')
    print("Quizid",Quiz_id)
    Qid = request.POST.get('Qid')
    print("questionid",Qid)
    quizid = quiztitle(Quiz_id=Quiz_id)
    quesid = question(Qid=Qid)

    response = answer(Answer=Answer)
    response.User_id = request.user
    response.Quiz_id = quizid
    response.Qid = quesid
    response.save()
    return HttpResponseRedirect('/response')

return render(request, "sample.html", context={"ques": ques, "title": title, "myuser": myuser})

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-templates


    【解决方案1】:

    我想对代码进行一些更改。 首先在 HTML 中,您使用 for 循环创建多个具有相同 ID 的元素。请删除它。

    {% for x in title %}
             <h1 class="title"><i class="fa fa-circle" id="quiz-icon" ></i>{{x.Quiz_title}}<button>Attempt Quiz</button></h1>
             {% endfor %} 
    

    说到你的问题,我会做这样的事情。

    1. 更改按钮以将参数链接为 quizID
    {% for x in title %}
             <h1 class="title"><i class="fa fa-circle" id="quiz-icon" ></i>{{x.Quiz_title}}<a href="/attempt-quiz/{{x.Quiz_id}}/">Attempt Quiz</a></h1>
             {% endfor %} 
    
    1. 在 urls.py 文件中为其创建 url
    path('attempt-quiz/<str:i>/',views.attempt_quiz,name="attempt_quiz"),
    
    1. 编写视图函数
    def attempt_quiz(request,i):  
    quiz_obj = quiztitle.objects.get(id=i)
    questions = question.objects.filter(Quiz_id=quiz_obj)
    return render........
    

    你得到所有的问题对象。现在您可以使用 .运营商

    for i in questions:
    print(i.Quiz_id.Quiz_title)
    print(i.Qques)
    print(i.Qoption1)
    print(i.Qoption2)
    print(i.Qoption3)
    print(i.Qoption4)
    

    【讨论】:

      【解决方案2】:

      你在这里做错了一些事情:

      1. 你的类名应该用驼峰式书写

      2. 你的类属性应该小写

      3. 确保在模型属性和方法定义之间留有空格。

      4. 我们无法真正看到是什么发出了请求,是什么触发了按钮?我不知道您是否在请求使用 JS 的内容,因为我看不到任何链接或包装按钮的“a”标签。

      正如我所说,您需要确保使用查询集管理器中的 .filter() 方法,它接受类属性作为参数,如下所示:

      model.objects.filter(attribute=your_request)。希望这可以帮助!如果您需要帮助,请告诉我。

      def handle_res(request):
      myuser = User.objects.all()
      title = quiztitle.objects.filter(quiztitle=your_title) # Code Changed
      ques = question.objects.all()
      if request.method == 'POST':
          Answer = request.POST.get('ans')
          print("Answer",Answer)
          Quiz_id = request.POST.get('Quiz_id')
          print("Quizid",Quiz_id)
          Qid = request.POST.get('Qid')
          print("questionid",Qid)
          quizid = quiztitle(Quiz_id=Quiz_id)
          quesid = question(Qid=Qid)
      
          response = answer(Answer=Answer)
          response.User_id = request.user
          response.Quiz_id = quizid
          response.Qid = quesid
          response.save()
          return HttpResponseRedirect('/response')
      
      return render(request, "sample.html", context={"ques": ques, "title": title, "myuser": myuser})
      

      【讨论】:

      • 感谢您的回复..我已经编辑了我的问题以提供更多详细信息...它仍在获取存储在问题表中的所有问题...我关心的是仅获取问题表中测验标题与用户选择的测验标题相同的那些字段(当用户单击 student.html 中的尝试测验按钮时)请帮助我的小项目。
      • student.html 正在显示测验标题表中存在的所有标题的列表。所以用户来并选择一个标题,例如:他选择“Python MCQs”并被定向到 sample.html 页面以尝试他的测验,但这里的问题在这里显示问题表中存在的所有问题,只有问题存在于“ Python MCQs”标题应该从问题表中获取。 question.objects.all 不能代替这个尝试使用 questions.objects.filter(quiz_title='that quiz_title input by user given in student.html') 我该怎么做?
      猜你喜欢
      • 2021-09-18
      • 1970-01-01
      • 2021-04-20
      • 2014-08-17
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多