我试图为下面的模型生成一个动态表单(为了简洁起见,删除了一些字段):
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
的确切数量,但是用户仍然需要从下拉列表中选择每个选项,这很容易出错并失去概述。
我是不是用错误的方式塑造我的模型?有什么建议能让我们更好地处理这个问题吗?
1条答案
按热度按时间cpjpxq1n1#
我建议你使用这种模式:
这就像一个购物网站用户选择了一些项目,并为所选项目输入了一个数量,后端在向她的购物篮添加了一些评论后将它们保存到她的购物篮中,推动购物篮付款。..,你唯一需要的是它显示了一个选项列表,并给予一个数量,然后将这些项目添加到她的篮子(BreakfastPreference)之后,将数量和其他东西添加到BreakfastPreferenceOptions,没有任何限制。参考使用Django的这个文档,用于ManyToManyField和通过表(中间表)