Django:如何将相同的功能扩展到多个视图?

Posted

技术标签:

【中文标题】Django:如何将相同的功能扩展到多个视图?【英文标题】:Django: How do I extend the same functionality to many views? 【发布时间】:2013-01-16 07:44:43 【问题描述】:

我在网站的许多部分都使用了一个父模板,称为base.html。该模板包含许多功能组件,例如触发不同表单的按钮(在模式窗口内)允许用户上传不同类型的内容等。我希望用户能够从站点的几乎任何部分单击这些按钮(来自所有继承自base.html 的模板)。

我编写了一个处理站点主页的视图,HomeView(它呈现homepage.html,它继承自base.html)。我在这个视图中写了一堆功能,它处理所有的上传。

由于许多模板将从base.html 继承,因此具有所有相同的功能,我是否必须将HomeView 中的数百行代码复制并粘贴到呈现所有模板的视图中?其他页面??

一定有更好的方法,对吧?

如何确保父基础模板中的功能适用于所有调用从该基础模板继承的子模板的视图?

【问题讨论】:

【参考方案1】:

您可以将 HomeView 中的所有代码行放在一个单独的函数中,让我们成为 func 并让func 返回一个包含所有需要的上下文变量的字典 并在需要时调用它,以便您的 HomeView 看起来像这样:

def HomeView(request):
  dict = func(request)
  ... # rest of code that is not common with other views

你的func 看起来像:

def func(request):
  #all repeated code
  #put all needed variables in a dictionary and return it
  dict = 'var1': 4, 'var2': "a String" ...
  return dict

【讨论】:

【参考方案2】:

我相信将与上传相关的功能分离到单独的视图中会是更好的方法。这样,您的所有模板(继承自 base.html)都将引用适当的视图以进行上传。

您可以使用HTTP_REFERER 标头从上传视图重定向到适当的页面。

【讨论】:

【参考方案3】:

您可以通过在每个视图中要求唯一值或使用请求会话来在一个视图中呈现多个模板。

【讨论】:

【参考方案4】:

    home_view 中使用TemplateResponse 而不是HttpResponse。这样您就可以在响应中更新上下文并切换模板。

    在类似这样的其他视图中调用home_view

    from django.template.response import TemplateResponse
    
    def other_view( request ):
    
        #produce other_context
    
        t = home_view( request )
        t.context.update( other_context )
        t.template = 'other_template.html'
        return t
    

【讨论】:

【参考方案5】:

在 base.html 上使用 ajax 加载功能部分。

这样你就有了一个专门处理这些功能的 view_method。

【讨论】:

以上是关于Django:如何将相同的功能扩展到多个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回调传递到Django中的另一个视图?

Django - 如果我在视图中将 2 个表单集放在一起,则添加多次相同视图的功能不起作用

如何更改扩展基本模板的 Django HTML 视图文件?

我如何在 django 的同一视图功能中将最近保存的数据发送到模板中

Django:视图如何从 url 获取多个值?

如何像在 Django admin 中一样从模型自动创建视图?