使用forms.py在Django中创建动态填充的一页多问题调查?
我试图在Django中创建一种调查应用程序,其中问题(称为类别)和选项自动显示在一个页面上。类别和选项的数量是任意的-页面需要显示所有内容。像这样:使用forms.py在Django中创建动态填充的一页多问题调查?,django,django-forms,Django,Django Forms,我试图在Django中创建一种调查应用程序,其中问题(称为类别)和选项自动显示在一个页面上。类别和选项的数量是任意的-页面需要显示所有内容。像这样: Category 1: Response a Response b Category 2: Response c Response d Response e etc. [submit] 我已经创建了一个工作视图,在很大程度上依赖于我的模板,而不是forms.py。(还没有表单验证。)现在所有选项都是单选
Category 1:
Response a
Response b
Category 2:
Response c
Response d
Response e
etc.
[submit]
我已经创建了一个工作视图,在很大程度上依赖于我的模板,而不是forms.py。(还没有表单验证。)现在所有选项都是单选按钮,但稍后我将使用不同类型的输入,如复选框、文本等
我正在寻找一种依靠forms.py和views.py实现这一点的方法,而不是在我的模板中包含大部分逻辑
这是我的密码:
models.py:
class Category(models.Model):
category_name = models.CharField('Kategoriens navn', max_length=100)
category_created_at = models.DateTimeField(default=timezone.now, editable=False)
class CategoryOption(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
option_name = models.CharField('Knappens navn', max_length=100)
option_created_at = models.DateTimeField(default=timezone.now, editable=False)
class Response(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
response_created_at = models.DateTimeField(default=timezone.now, editable=False)
class ResponseValues(models.Model):
response = models.ForeignKey(Response, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
option = models.ForeignKey(CategoryOption, on_delete=models.CASCADE)
views.py:
def project(request):
categories = Category.objects.filter(project=project) # project variable excluded for simplicity
if request.method == 'POST':
response = Response(project=project, user=request.user)
response.save()
for category in categories:
category_id = str(category.pk)
option = request.POST.get(category_id)
if option:
option = CategoryOption.objects.get(id=option)
responsevalues = ResponseValues(response=response, category=category, option=option)
responsevalues.save()
context = {'categories': categories,}
return render(request, 'survey/project.html', context)
project.html:
<form action="" method="post">
{% csrf_token %}
{% for category in categories %}
<h4>{{ category.category_name }}</h4>
{% for option in category.categoryoption_set.all %}
<input type="radio" name="{{ category.pk }}" value="{{ option.pk }}" id="{{ option.pk }}"><label for="{{ option.pk }}">{{ option.option_name }}</label><br>
{% endfor %}
{% endfor %}
<input type="submit" value="Save">
</form>
models.py:
类别(models.Model):
类别名称=models.CharField('Kategoriens navn',最大长度=100)
category_created_at=models.DateTimeField(默认值=timezone.now,可编辑值=False)
类别选项(models.Model):
类别=模型.ForeignKey(类别,on_delete=模型.CASCADE)
选项名称=models.CharField('Knappens navn',最大长度=100)
选项_created_at=models.DateTimeField(默认值=timezone.now,可编辑值=False)
类响应(models.Model):
project=models.ForeignKey(project,on_delete=models.CASCADE)
user=models.ForeignKey(用户,on_delete=models.CASCADE)
response\u created\u at=models.DateTimeField(默认为timezone.now,可编辑为False)
类响应值(models.Model):
响应=models.ForeignKey(响应,on_delete=models.CASCADE)
类别=模型.ForeignKey(类别,on_delete=模型.CASCADE)
option=models.ForeignKey(CategoryOption,on_delete=models.CASCADE)
views.py:
def项目(请求):
categories=Category.objects.filter(project=project)#为简单起见,排除了项目变量
如果request.method==“POST”:
响应=响应(项目=项目,用户=请求。用户)
response.save()
对于类别中的类别:
category_id=str(category.pk)
option=request.POST.get(category\u id)
如果选择:
option=CategoryOption.objects.get(id=option)
响应值=响应值(响应=响应,类别=类别,选项=选项)
responsevalues.save()
上下文={'categories':类别,}
返回呈现(请求'survey/project.html',上下文)
project.html:
{%csrf_令牌%}
{categories%%中的类别为%s}
{{category.category_name}
{category.categoryooption_set.all%}
{{option.option_name}}
{%endfor%}
{%endfor%}