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编写通用更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的自定义与通用视图

带有更新的 slug 的 Django 通用视图 UpdateView 重定向 URL

Django 和通用视图

5 第一个Django第4部分(表单和通用视图)

基于 Django 类的视图和通用视图详细信息使用

如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?