如何在django中为一个问题添加多个表单字段类型的选项?

如何在django中为一个问题添加多个表单字段类型的选项?,django,django-models,django-admin,Django,Django Models,Django Admin,我正在创建一个类似“轮询”的应用程序。在这个应用程序中会有问题,每个问题都有一个或多个答案选择答案选择可以是文本、图像或视频。 我制作了一个名为“问题”的模型,并针对不同的选择类型制作了不同的模型: class Question(models.Model): question_text = models.TextField() category = models.ForeignKey(QuestionCategory) created_at = models.DateTi

我正在创建一个类似“轮询”的应用程序。在这个应用程序中会有问题,每个问题都有一个或多个答案选择答案选择可以是文本、图像或视频。

我制作了一个名为“问题”的模型,并针对不同的选择类型制作了不同的模型:

class Question(models.Model):
    question_text = models.TextField()
    category = models.ForeignKey(QuestionCategory)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class ChoiceText(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice = models.CharField(max_length=255)


class ChoiceImage(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice = models.ImageField()
  • 这是设计模型的好方法,还是有更好的方法来解决这个问题
  • 它在管理方面看起来也不那么直观,在管理方面有什么建议吗?我看了一下,但我仍然对如何将不同的选择组合成更好的用户友好方式感到困惑

  • 假设一个问题可能有多个相同类型的答案,例如一个问题可能有4个文本选项和2个图像选项,这可能是最好的方法

    根据您计划如何使用这些模型,您可能希望创建一个名为
    Choice
    的模型类,并从中获得其他模型子类


    Django的管理表单是高度可定制的。既然您没有给我们任何细节,请随意探索。

    我建议您选择相同的型号(选择)。您可以有一个名为choice_type的字段,用于选择选项的类型(“图像”、“文本”、“视频”)


    在添加来自admin或front的数据时,您可以使用自定义表单,该表单具有基于choice_类型的clean method(需要基于choice类型的字段、图像字段验证、视频文件验证)中的验证规则。

    这似乎不太符合逻辑,使用继承会更好。@ubadub这里没有任何东西看起来是不和谐的。这取决于您如何以更好的方式实现解决方案。正如我所解释的,继承会更好。这就是继承的真正目的。我实现了inhertance和这两种方法,继承在管理端很难定制。这一个在管理方面更容易。我仍然不知道哪种方法更好。我会做更多的挖掘并接受一个答案。谢谢你的建议,唯一的问题是管理员端被模型表单弄得乱七八糟,因为我只需要一个模型表单,这取决于选择的类型。@DrGeneral管理员端是自定义的。我有同样的问题,但更复杂,我希望得到更好的答案。我在Django Admin中添加了一个缓存管理器。根据缓存类型,值可以是Bool、User、Str等,而不是使用多个字段,我希望根据选择动态更改表单的类型
    class Choice(models.Model):
        answer_type_choices = (
            ('1','Text'),
            ('2','Image'),
            ('3','Video'),
        )
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        choice_type = model.CharField(max_length=1,choices = answer_type_choices)
        choice = models.CharField(max_length=255)
        choice_media = models.FileField(upload_to='uploads/')