如何在Django中为问题添加多种形式的选择字段类型?

时间:2018-09-14 00:57:42

标签: django django-models django-admin

我正在创建一个类似“投票”的应用程序。在此应用程序中将有问题,每个问题将有一个或多个答案选择。 答案选项可以是“文本”,“图像”或“视频”。

我已经建立了一个名为Question的模型,并为不同的选择类型建立了不同的模型:

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()
  1. 这是设计模型的好方法,还是有解决此问题的更好方法?
  2. 在管理方面看起来也不那么直观,在管理方面有什么建议吗?我看着https://docs.djangoproject.com/en/2.1/intro/tutorial07/,但对于将不同的选择组合成更好的用户友好方式仍然感到困惑。

2 个答案:

答案 0 :(得分:0)

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

根据您计划使用这些模型的方式,您可能想要创建一个名为Choice的模型类,并从中获得其他模型的子类。

Django的管理表单是高度可定制的。由于您尚未提供任何详细信息,请随时浏览the Django admin docs

答案 1 :(得分:0)

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

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/')

在从管理员或前端添加数据时,您可以通过一些自定义表单来创建表单,该表单具有基于cleaning方法的验证规则(要求基于选择类型的字段,图像字段验证,视频文件验证)基于choice_type。