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 的属性和重新定义的字段?的主要内容,如果未能解决你的问题,请参考以下文章
带有 ModelForm 和 ModelFormSet 的 Django WizardView(这个不渲染)
Django 'QuerySet' 对象没有使用 modelform 的属性'split'
带有 Select Widget 的 Django ModelForm - 使用 object.uid 作为默认选项值而不是 object.id