【问题标题】:How to add multiple form field types of choices for a question in django?如何在 django 中为问题添加多种表单字段类型的选择?
【发布时间】:2018-09-14 00:57:42
【问题描述】:

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

我已经为不同的选择类型制作了一个名为 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/,但我仍然对将不同的选择组合成更好的用户友好方式感到困惑。

【问题讨论】:

  • 我有同样的问题,但更复杂,我期待一个更好的答案。我在 Django Admin 中添加了一个缓存管理器。根据缓存类型,值可以是 Bool、User、Str 等,而不是使用多个字段,我想根据选择动态更改表单的类型

标签: django django-models django-admin


【解决方案1】:

我建议您使用相同的型号(选择)。您可以有一个名为choice_type 的字段,用于选择选择的类型('image'、'text'、'video')。

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

在从管理员或前台添加数据时,您可以拥有一些自定义的表单,该表单具有基于choice_type 的干净方法中的验证规则(需要基于选择类型的字段、图像字段验证、视频文件验证)。

【讨论】:

  • 这似乎很不合python,使用继承会更好。
  • @ubadub 这里似乎没有什么不符合 Python 的。这取决于您如何以更好的方式实施解决方案。
  • 正如我所解释的,继承会更好。这就是继承的意义所在。
  • 我实现了两种方法,继承和这个,继承在管理方面很难定制。这在管理方面更容易。我仍然对哪种方法更好感到困惑。我会做更多的挖掘并接受一个答案。
【解决方案2】:

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

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

Django 的管理表单是高度可定制的。由于您没有向我们提供任何细节,请随时探索the Django admin docs

【讨论】:

  • 感谢您的建议,唯一的问题是管理端被模型表单弄乱了,因为我只需要其中一个,具体取决于选择的类型。
  • @DrGeneral 管理端是可定制的
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2011-07-02
  • 2015-01-13
  • 2020-05-29
  • 2011-05-19
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多