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

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

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

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

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

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

【问题讨论】:

    标签: python django django-templates django-views template-inheritance


    【解决方案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】:
          1. home_view 中使用TemplateResponse 而不是HttpResponse。这样您就可以在响应中更新上下文并切换模板。

          2. 在类似这样的其他视图中调用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。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-12-20
              • 1970-01-01
              • 2022-08-18
              • 2021-04-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多