django - 如何创建一个在同一页面上显示所有单选按钮的表单?
问题描述
我正在创建一个测验/调查应用程序。
- 如何使用表单(例如 ModelForm)在同一页面上显示每个问题的选项和单选按钮?(我已阅读文档,但目前似乎无法生成有效的 ModelForm。)
- 如何通过单击一个提交按钮将所有单选按钮选择返回到视图?
我花了一天的时间阅读文档、在线文章和尽可能多的 SO 答案。我怀疑有几个因素我错过了。
我已经求助于使用模板标签编写页面。我想知道如何正确使用 django 表单。
模型.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}\''
视图.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 表单制作同样的东西。
解决方案
关于:
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 中创建自定义模型表单(如何在 django 模型表单中添加自定义字段?)。为了实现我想要的,这涉及使用 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 访问表单集数据)。在数据库中创建并保存适当的模型记录。
推荐阅读
- reactjs - 如何通过单击菜单按钮不更改地址。只交换屏幕上的一个组件?
- javascript - NodeJS 和 Retrofit 的多部分数据问题
- python - Python - 尝试除外
- azure - 您能否将应用服务日志或应用程序洞察日志摄取到 azure 事件中心
- c# - ObjectListView 在 SetObjects() 上抛出 InvalidCastException
- python - Teradataml:删除由 Teradata MLE 函数创建的所有临时表
- mysql - 如何确保单元测试原则正试图加载到与 dev 相同的数据库?
- azure - ACR 的 Azure 模块
- bash - 如何在bash中使用变量替换来回显字符串?
- github-actions - 带有分支过滤器的 GitHub Actions 标记过滤器