【问题标题】:How do I create a form that displays radio buttons for all on the same page?如何创建一个在同一页面上显示所有单选按钮的表单?
【发布时间】:2019-09-22 08:42:07
【问题描述】:

我正在创建一个测验/调查应用程序。

  1. 如何使用表单(例如 ModelForm)来显示选项 以及同一页面上每个问题的单选按钮? (我有 阅读文档,但目前似乎无法生成 有效的 ModelForm。)
  2. 如何通过单击一个提交按钮将所有单选按钮选择返回到视图?

我花了一天时间阅读文档、在线文章以及我能找到的尽可能多的 SO 答案。我怀疑我遗漏了几个因素。

我已经求助于使用模板标签来编写页面。我想知道如何正确使用 django 表单。

models.py

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


class Collection(models.Model):
    date = models.DateTimeField()

    def __str__(self):
        return 'Collection of questions'


class Question(models.Model):
    question_text = models.CharField(max_length=400)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE, default=None)
    date_published = models.DateTimeField('date published')

    @property
    def options(self):
        options = self.option_set.all()
        return options if options.exists() else 'No options for this question'

    def __str__(self):
        return self.question_text


class Option(models.Model):
    option_text = models.CharField(max_length=400)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.option_text}'


class Answer(models.Model):
    claim_reference_number = models.IntegerField()
    date_selected = models.DateTimeField('date selected')
    chosen_option = models.ForeignKey(Option, on_delete=models.CASCADE)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)

    @property
    def question(self):
        return self.chosen_option.question

    def __str__(self):
        return f'{self.claim_reference_number} selected \'{self.chosen_option}\' in response to \'{self.question}\''

views.py

def new_assessment(request, reference_number):
    collection = Collection.objects.get(pk=1)
    context = {'collection': collection,
               'reference_number': reference_number,
               }
    return render(request, 'ad/templates/new_assessment.html', context)

模板

<h2>New survey</h2>
<form method="POST" action=''>
    {% csrf_token %}
    <div> reference_number = {{ reference_number }}</div>
    {% for question in collection.question_set.all %}
    <h5>{{ question.question_text }}</h5>
        {% for option in question.option_set.all %}
            <p><input type="radio" name="option for {{ question.pk }}" id="option{{ option.pk }}">
            <label for="option{{ option.pk }}">{{ option.option_text }}</label></p>
        {% endfor %}
    {% endfor %}
        <br>
    <button type="submit" class="save btn btn-default" value="selected">Save</button>
</form>

我目前使用 html 和模板标签的结果如下。我想使用 django 表单制作同样的东西。

![图片]https://imgur.com/gizp0rT

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    关于:

    1. How may I use a form (such as a ModelForm) to display the options and a radio button for each question on the same page?
    

    我使用了带有自定义模型表单的模型表单集工厂。这是由以下人员完成的:

    a) 在 forms.py (How to add a custom field in django model form?) 中创建自定义模型表单。为了实现我想要的,这涉及使用 Meta 类:将choices 定义为与特定问题相关的选项的外键;并为每个选项添加 RadioSelect 小部件。

    b) 创建模型表单集。这涉及使用模型表单集工厂和您的自定义模型表单 (https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/) 构建模型表单集

    c) 使用视图将模型表单集从 forms.py(我在其中创建模型表单集和自定义表单)传递到模板。

    2. How may I return all of the radio button selections to the view by clicking one submit button?
    

    按下提交按钮将完成的表单集发布回视图。一旦它到达,迭代表单集数据(Django accessing formset data)。在数据库中创建并保存适当的模型记录。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多