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 表单:查询结果定义的字段,单个视图同时更新多个对象的主要内容,如果未能解决你的问题,请参考以下文章

Django - 呈现单个表单字段的 <label>

单个视图中的多个表单

Django

Django之路——form modelform formset modelformset的各种用法

自定义 django 管理视图

Django - 如何排除表单字段视图?