Django表单,动态的项目数量取决于其他模型

kokeuurv  于 2023-05-01  发布在  Go
关注(0)|答案(1)|浏览(94)

我试图为下面的模型生成一个动态表单(为了简洁起见,删除了一些字段):

class BreakfastOption(CreatedUpdatedByMixin, TimeStampedModel):

    """Option for breakfast, e.g. white bread, brown bread, tea, coffee"""

    name = models.CharField(max_length=30, unique=True)
    BREAKFAST_CATEGORY_CHOICE = (
        ('food_week', 'Food during week'),
        ('food_weekend', 'Food during weekend'),
        ('drinks', 'Drinks'),
    )
    category = models.CharField(max_length=32, choices=BREAKFAST_CATEGORY_CHOICE, )

class BreakfastOptionChoice(CreatedUpdatedByMixin, TimeStampedModel):

    """Option for breakfast along with its desired quantity, e.g. 2 slices of white bread and one tea"""

    breakfast_option = models.ForeignKey(BreakfastOption, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField()

class BreakfastPreference(CreatedUpdatedByMixin, TimeStampedModel):

    """Person's choice for breakfast, e.g. 2 slices of white bread and 1 tea, along with comments"""

    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    start_date = models.DateField(default=datetime.date.today)  # Used for tracking changes
    choices = models.ManyToManyField(BreakfastOptionChoice)
    comments = models.TextField(blank=True, null=True)

我想要的是一个BreakfastPreference的表单,用户可以在其中看到可用BreakfastOption的整个列表(大约8个),并可以输入这些数量沿着总体评论。
示例形式:

  • 人员:(通过URL预填)
  • “白色面包片”数量:2
  • “黑面包片”数量:0
  • “茶叶”数量:1
  • “咖啡”数量:0
  • 点评:人想早点吃早餐

在上面的示例中,行2至5是动态生成的(即,即,可以有4个,但是在将来的点可以有5个或更多个选择)。提交后,将保存以下项目:

  • 一个BreakfastPreference s代表人员X,注解Y(带有choices
  • 两个BreakfastOptionChoice:白色面包片2份,茶1份

我以前使用过表单集,但这似乎不完全符合目的,因为我只得到了几个BreakfastOptionChoice对象。我可以将数量设置为可用的BreakfastOptions的确切数量,但是用户仍然需要从下拉列表中选择每个选项,这很容易出错并失去概述。
我是不是用错误的方式塑造我的模型?有什么建议能让我们更好地处理这个问题吗?

cpjpxq1n

cpjpxq1n1#

我建议你使用这种模式:

Model BreakfastPreference:
    user : FK to User
    start_date : Your Date
    options : MTM field to BreakfastOption with through table
    comments : String Field

    
Model BreakfastPreferenceOptions:
    user : FK to User
    break_fast_preference : FK to BreakfastPreference
    quantity : Integer Field
    price : optional field ?
    comment : Comment per option ?

这就像一个购物网站用户选择了一些项目,并为所选项目输入了一个数量,后端在向她的购物篮添加了一些评论后将它们保存到她的购物篮中,推动购物篮付款。..,你唯一需要的是它显示了一个选项列表,并给予一个数量,然后将这些项目添加到她的篮子(BreakfastPreference)之后,将数量和其他东西添加到BreakfastPreferenceOptions,没有任何限制。参考使用Django的这个文档,用于ManyToManyField和通过表(中间表)

相关问题