Django表单和子表单的方法

时间:2014-09-23 11:49:37

标签: django forms methodology

这是一个悬而未决的问题。 我正在尝试编写HTML页面来定义/编辑 问题 (数据库对象)。 问题 由小文本和类型组成:类型表示其偏角。 例如,问题倾向是滑块是 - 否自由文本多项选择。 对于自由文本是 - 否拒绝,不需要进一步的信息。 但是对于滑块多选,必须输入附加信息。

现在我完成/尝试的是创建表单,视图和模板来定义一般问题,并创建 sub 表单,每个问题偏差的视图和模板,需要额外的字段。

问题是我在子表单中保留通用问题ID 以将附加字段附加到问题时遇到困难。我试图将它传递给子视图,但我必须在表单中访问它以使用问题引用保存数据库对象,因此这意味着在表单中添加隐藏的输入字段,这会导致其他问题,等等等...

我缺少的是网络开发体验......我能得到的更好的是动态下拉菜单适应所选的问题类型,但我不知道javascript或ajax语言现在,所以一些不同的观点/模板就足够了。

实现这一目标的最简单/最好的方法是什么? 我不是要求代码而是要求方法。

如果我错过了让问题难以理解的事情,请告诉我。

1 个答案:

答案 0 :(得分:2)

您的方法对我来说似乎很好(创建基本视图,表单类和模板,可以为每个偏差继承和定制),模型部分除外。

由于您的倾向可能包含一些自定义字段,因此我不认为在您的所有问题类型中使用相同的模型是有效的。

我会使用model inheritance,如下所示:

class BaseQuestion(models.Model):
    """Your base model for all questions"""
    title = models.CharField(max_length=255)
    description = models.TextField()

class YesNoQuestion(BaseQuestion):
    pass

class FreeTextQuestion(BaseQuestion):
    pass

class MultipleChoicesQuestion(BaseQuestion):
    # assuming you have a QuestionChoice model to store your available choices
    choices = models.ManyToManyField(QuestionChoice)

class SliderQuestion(BaseQuestion):
    slider_start = models.IntegerField(default=1)
    slider_end = models.IntegerField(default=10)

请参阅Django文档以获得有关模型继承的深入解释,但您需要了解一件事:它会影响性能,尤其是在大型数据库上。但是,在你的情况下,似乎还有很长的路要走。

另请注意,某些django应用程序(如django-polymorphic)可能会帮助您处理模型继承。

对于剩下的过程,我会遵循这个过程:

  • 处理问题基本表单的视图(标题和说明字段),以及包含所有可用问题拒绝列表的附加字段
  • 当用户选择类型时,您将触发将发布表单数据的ajax请求。视图不保存任何内容,而是返回另一个表单,对应于选定的偏角,并填充先前输入的值。这样,您就不会关心保留ID,因为会返回一个全新的表单。
  • 在帖子上,此表单应触发另一个专用视图,用于处理数据并将相应问题模型的实例保存到数据库中
相关问题