使用forms.py在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。(还没有表单验证。)现在所有选项都是单选

我试图在Django中创建一种调查应用程序,其中问题(称为类别)和选项自动显示在一个页面上。类别和选项的数量是任意的-页面需要显示所有内容。像这样:

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%}