Django编写通用更新视图
Posted
技术标签:
【中文标题】Django编写通用更新视图【英文标题】:Django writing generic update view 【发布时间】:2016-02-07 07:37:54 【问题描述】:我正在尝试为我的需要编写一个通用的更新视图。 我的视图应该更新不同模型中具有相同名称的字段。 检查用户是否有权限,类似于@permission_required 装饰器。 应该在一个对象上工作。 适用于 ajax 请求 - 意味着我需要返回一个代码/json。 我没有使用 django 内置的表单,我自己编写它们。 由于这些原因,我无法使用 UpdateView 中内置的 django。 我想扩展 SingleObjectMixin。我被困在应该将模型保存到数据库的位置。
【问题讨论】:
【参考方案1】:class MyUpdateView(generic.UpdateView):
...
def form_valid(self,form):
# ... do something here ...
obj = form.save()
obj1 = AnotherModel.objects.get(...)
obj1.the_field = obj.the_field
obj1.save()
obj2 = YetAnotherModel.objects.get(...)
obj2.the_field = obj.the_field
obj2.save()
return super(MyUpdateView,self).form_valid()
或者,您可以在表单保存方法中实现它:
class MyForm(forms.ModelForm):
def save(self):
obj = super(MyForm,self).save()
# ... save to other models
return obj
然后在你看来:
if form.is_valid():
obj = form.save()
【讨论】:
可能会很好。但正如我所说,我不使用 django 内置形式。所以我不能扩展 updateview 类。 如果你只是添加一些保存行为,扩展是最简单的方法。但这完全取决于您,您必须在“form.is_valid()”之后使用“form.save()”保存表单。额外的保存代码可以在视图中运行,也可以在表单保存方法中运行。 CBV 只是为您处理它。更新了答案。 我根本没有任何 modelform/form 类。我在 html 中手动编码表单。所以我猜 form_valid 方法行不通。问题是我是否仍然可以使用 updateview 或创建类似的东西,并自己实现 form.save() 所做的事情。我不确定我应该扩展哪些类。 我认为你错过了 django 核心架构中的一些东西。表单是处理 HTML 和用户输入的 Python 类。当然,你可以自己写,但为什么呢? 我知道可以将表单编写为 python 类。但出于某些原因,我选择不这样做——我的表单包含一些繁重的 javascript,当表单是单独的 py 文件时,这些 javascript 很难维护。我不喜欢我必须在我在 javascript 代码中引用的表单类中编写“id”属性。以上是关于Django编写通用更新视图的主要内容,如果未能解决你的问题,请参考以下文章