【问题标题】:Taking value of selected radio buttons from one page in Django从 Django 的一页中获取选定单选按钮的值
【发布时间】:2021-01-19 07:29:54
【问题描述】:

我想在单个页面中获取选定单选按钮的值。在这里解释一下是我在models.py文件中的代码

class Quiz(models.Model):
    Description = models.CharField(max_length=200)

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

class Question(models.Model):
    Question_Text = models.CharField(max_length=500)
    Option1 = models.CharField(max_length=100)
    Option2 = models.CharField(max_length=100)
    Option3 = models.CharField(max_length=100, blank=True)
    Option4 = models.CharField(max_length=100, blank=True)
    Answer = models.CharField(max_length=100)
    QuizID = models.ForeignKey(Quiz, on_delete=models.CASCADE)

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

我希望用户从“Option1、Option2、Option3、Option4”字段中选择一个选项,并且我想获取所选单选按钮的值。

这是我的尝试:

disp.html

<form action="" method="post">
                {% csrf_token %}
                {% for q in question %}
                    {{ q.Question_Text }} <br>
                    <input type="radio" id="question_{{ q.Option1 }}" name="{{ q.id }}" value="{{ q.Option1 }}">
                    <label for="question_{{ q.Option1 }}">{{ q.Option1 }}</label> <br>
                    <input type="radio" id="question_{{ q.Option2 }}" name="{{ q.id }}" value="{{ q.Option2 }}">
                    <label for="question_{{ q.Option2 }}">{{ q.Option2 }}</label> <br>
                    {% if q.Option3 %}
                        <input type="radio" id="question_{{ q.Option3 }}" name="{{ q.id }}" value="{{ q.Option3 }}">
                        <label for="question_{{ q.Option3 }}">{{ q.Option3 }}</label> <br>
                    {% endif %}
                    {% if q.Option4 %}
                        <input type="radio" id="question_{{ q.Option4 }}" name="{{ q.id }}" value="{{ q.Option4 }}">
                        <label for="question_{{ q.Option4 }}">{{ q.Option4 }}</label> <br>
                    {% endif %}
                {% endfor %}
                <br> <input type="submit" class="btn btn-primary" value="Submit">
            </form>

现在我想获取所选单选按钮的值。由于记录的数量可能会有所不同,因此我无法手动获取所选单选按钮的值,例如:

first = request.POST.get("11")
second = request.POST.get("18")
third = request.POST.get("19")

这里11,18和19是问题模型中记录的id字段的值。

所以我尝试使用 for 循环按以下方式执行此操作,但我得到“无”作为值。

view.py

def disp(request):
    quiz = get_object_or_404(Quiz, id = 4)
    question = get_list_or_404(Question, QuizID = quiz)

    if request.method == "POST":
        for q in question:
            response = request.POST.get("q.id")
            print(response)


    return render(request, 'quiz/disp.html', {'question' : question, 'quiz' : quiz})

请帮助我获取所选单选按钮的值,或者如果有其他方法可以获取所选单选按钮的值,请建议我

【问题讨论】:

    标签: python html django forms django-forms


    【解决方案1】:

    我会重新配置 Question 模型以使用 Choices:

    SOME = 'win'
    OTHER = 'lin'
    
    Answer_CHOICES = (
        (SOME, 'Some Answer'),
        (OTHER, 'Other Answer'),
    )
    
    class Question(models.Model):
        ....
        Options = models.CharField(choices=Answer_CHOICES, max_length=100)
        ....
    

    检查Choices field 以及如何使用它。另外,请检查crispy forms,它会自动为您处理表单输入。

    【讨论】:

      【解决方案2】:

      POST &lt;QueryDict&gt; 仅包含 &lt;str&gt; 类型的键。这意味着request.POST.get(18) 将返回Nonerequest.POST.get('18') 将返回值(假设密钥存在于POST &lt;QueryDict&gt; 中)。

      if request.method == "POST":
          for q in question:
              # convert the q.id into str
              response = request.POST.get(str(q.id))
              print(response)
      

      您可以遍历 POST 数据并检查有效密钥。因为,POST 数据包含其他数据,例如 csrfmiddlewaretoken。

      将单选按钮名称属性的值改为question_{{ q.id }}的形式。

      <input type="radio" id="question_{{ q.Option1 }}" name="question_{{ q.id }}" value="{{ q.Option1 }}">
      

      循环POST,检查key是否包含question_

      if request.method == "POST":
          for k, v in request.POST.items():
              if 'question_' in k:
                  # do something
      

      【讨论】:

        【解决方案3】:

        在 view.py 中,您使用“q.id”作为 HTTP 参数名称,而我认为您希望它是 11、18、19 等。试试这个:-

        if request.method == "POST":
            for q in question:
                response = request.POST.get(q.id)
                print(response)
        

        【讨论】:

        • 它仍在打印“None”作为值。
        • 在此处共享整个 POST 数据(request.POST)。
        猜你喜欢
        • 2021-12-23
        • 2016-08-30
        • 1970-01-01
        • 2022-01-22
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 2014-09-09
        • 2012-01-27
        相关资源
        最近更新 更多