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

时间:2013-02-01 02:31:48

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

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

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

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

必须有更好的方法,对吧?

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  1. TemplateResponse中使用HttpResponse代替home_view。这样,您就可以在响应中更新上下文和切换模板。

  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
    

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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