Django - 带有 ModelForm 的属性和重新定义的字段?

Posted

技术标签:

【中文标题】Django - 带有 ModelForm 的属性和重新定义的字段?【英文标题】:Django - attributes and redefined fields with a ModelForm? 【发布时间】:2018-08-12 01:38:37 【问题描述】:

我一直在学习表单以及现在的 ModelForms 是如何工作的。

在Max Goodridge 的视频中,他在ModelForm 类中为他的ModelFields 重新定义了一个字段。也就是说,他手动将一个字段添加到他的ModelForm 类中,该字段本可以由ModelForm 框架自动生成。从我到目前为止所阅读和理解的内容来看,这可能是要避免的。不过,这不是我的问题所在。

我想知道如何在 ModelForm 类中重新定义字段。在 Django Docs 中,说明(带有示例) ModelForm 实例将为指定的每个模型字段都有一个表单字段。那么,当在 ModelForm 实例中显式定义表单字段时会发生什么?是否生成了两个字段,或者 ModelForm 是否识别出一个字段已定义,因此不会生成另一个?

此外,在视图中向 ModelForm 实例添加属性到底有什么作用?例如,我见过这样的:

form = ExampleForm(request.POST)
if form.is_valid():
    post = form.save(commit=False)
    post.user = request.user    # herein lies my confusion
    post.save()

这里到底发生了什么?我见过人们这样做并添加时间戳,但我无法准确理解它的作用。大概.save()方法识别出属性名'user',如果名字与Model-field名'user'相对应,则将其添加到数据库中?

    ModelForm 实例中显式定义表单字段时会发生什么?

    如何在ModelForm 实例中添加带有模型字段信息的属性?

谢谢!

【问题讨论】:

【参考方案1】:

当您在类级别定义字段时,表单将使用该定义,而不是从模型字段创建一个。如果您想完全自定义一个字段,这不是要避免的事情,而是正确的做法。

您的第二个问题很难理解。保存不是“识别”任何东西。 form.save() 返回模型的实例,您可以在其上正常设置任何字段值。

【讨论】:

谢谢! .save() 方法是指与 commit=True 一起使用的方法,最终保存表单 (form.save()) 我还是不明白——你没有任何commit=True的代码。 好吧,我仍然不确定您的困惑在哪里。 post模型实例,而不是表单。再一次,没有特殊的识别发生。 好的!那么 .save() 方法会获取经过验证的 request.POST 信息并将其保存到数据库中吗?它如何获取传递给 ModelForm 的数据?通过“cleaned_data”?

以上是关于Django - 带有 ModelForm 的属性和重新定义的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Django:带有条件的ModelForm

Django Modelform(带有排除字段)

带有引导程序的 django modelform

带有 ModelForm 和 ModelFormSet 的 Django WizardView(这个不渲染)

Django 'QuerySet' 对象没有使用 modelform 的属性'split'

带有 Select Widget 的 Django ModelForm - 使用 object.uid 作为默认选项值而不是 object.id