【问题标题】:Django writing generic update viewDjango编写通用更新视图
【发布时间】:2016-02-07 07:37:54
【问题描述】:

我正在尝试为我的需要编写一个通用的更新视图。 我的视图应该更新不同模型中具有相同名称的字段。 检查用户是否有权限,类似于@permission_required 装饰器。 应该在一个对象上工作。 适用于 ajax 请求 - 意味着我需要返回一个代码/json。 我没有使用 django 内置的表单,我自己编写它们。 由于这些原因,我无法使用 UpdateView 中内置的 django。 我想扩展 SingleObjectMixin。我被困在应该将模型保存到数据库的位置。

【问题讨论】:

    标签: django class view updates


    【解决方案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”属性。
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多