Django 表单:查询结果定义的字段,单个视图同时更新多个对象
Posted
技术标签:
【中文标题】Django 表单:查询结果定义的字段,单个视图同时更新多个对象【英文标题】:Django form: fields defined by query result, single view to update multiple objects simultaneously 【发布时间】:2016-07-18 19:26:50 【问题描述】:我在一个 Django 1.8 项目中有以下模型:
class MeditationType(models.Model):
"""
Stores user's meditation types and goals
"""
creation_date = models.DateTimeField(auto_now_add=True)
modify_date = models.DateTimeField(auto_now=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
meditation_name = models.CharField(max_length=30)
# Meditation goals per weekday, in minutes
goal_sun = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
goal_mon = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
goal_tue = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
goal_wed = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
goal_thu = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
goal_fri = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
goal_sat = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
def get_absolute_url(self):
return reverse('meditation_types_update', kwargs='pk': self.pk)
class MeditationLog(models.Model):
"""
Stores user's meditation logs (journal entries)
"""
creation_date = models.DateTimeField(auto_now_add=True)
modify_date = models.DateTimeField(auto_now=True)
meditation_date = models.DateTimeField()
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
meditation_type = models.ForeignKey(MeditationType, on_delete=models.CASCADE)
# Amount of time (in minutes) this meditation type was practiced on this date
meditation_minutes = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(1440)])
def get_absolute_url(self):
return reverse('meditation_types_update', kwargs='pk': self.pk)
我想构建一个包含以下字段的表单: form fields
请注意:
表单将用于创建和更新条目。
示例中使用的 3 种冥想类型(专注、正念和慈爱)由用户创建(MeditationType 模型),因此这些字段会有所不同。对于某些用户可能是单一的冥想类型,对于其他用户可能是 10 种不同的冥想类型。因此必须根据每个用户的冥想类型动态定义表单字段。
提交/发布此表单时,我们必须保存 MeditationLog 对象的多个实例(每种冥想类型一个)。
在 Django 1.8 中最简单有效的方法是什么?另外,如果您能想到更好的方法来构建模型(这将使表单构建更容易),请告诉我。
提前致谢。
【问题讨论】:
还会有其他 MeditationType 对象吗? 我是否正确假设您使用through='MeditationLog'
从 User 到 MeditationType 有一个 ManyToMany 字段?
Sardorbek:感谢您的回复。是的,每个用户都会创建自己的冥想类型。每个用户可能有 1、3 或 10 种不同的类型。
Rob:感谢您的回复。我没有这个 ManyToMany 字段。我正在使用 Django 的默认用户模型。一个用户可以有多种冥想类型,但每种冥想类型只属于一个用户。你能详细说明你的观点吗?
@BrunoF:没关系。我看错了。你实际上并不需要ManyToMany。很抱歉,如果我造成任何混乱。
【参考方案1】:
经过一番研究,我终于找到了可以使用的东西:
https://jacobian.org/writing/dynamic-form-generation/(Jacob 是 Django 的最初创始人之一)
http://www.dougalmatthews.com/2009/Dec/16/nicer-dynamic-forms-in-django/
https://code.djangoproject.com/wiki/CookBookNewFormsDynamicFields
http://agiliq.com/blog/2008/10/dynamic-forms-with-django/
http://blog.p3infotech.in/2013/how-to-create-dynamic-forms-in-django/
如果您有类似的问题,上面的链接可能会有所帮助。
感谢回复的人。
【讨论】:
以上是关于Django 表单:查询结果定义的字段,单个视图同时更新多个对象的主要内容,如果未能解决你的问题,请参考以下文章