将数据传递到django中的模板外部视图?

时间:2018-06-11 14:39:07

标签: django django-models django-templates django-views

我的意思是,我有经典的永远存在的侧面板,我想显示一些模型数据(例如,现有帖子发布日期,标签等的年/月)。

由于这个侧面板始终存在,我还想避免将检索逻辑放在我定义的每个视图中,因为它是重复的,容易出错/容错,不太可维护等等。

在django中有没有办法定义这样的逻辑并在我做的每个视图中绑定/注入它的结果?

更好的是直接在模板中执行此操作以将其与视图完全分离,因此如果我有一个不需要数据的不同页面(如登录/退出页面),django赢了&浪费工作/时间来检索/操纵甚至无法显示的东西。

提前致谢

2 个答案:

答案 0 :(得分:2)

CONTEXT_PROCESSORS中提供的上下文处理器将在该设置文件支持的每个模板中可用,以创建一个:

  • 在项目中创建一个文件,在context_processors.py
  • 旁边命名为settings.py
  • 在里面,创建一个函数,就像一个带有参数request的视图,并且应该返回一个字典

    def function_name(request):
        variable = 'Hello World'
        # all stuff that you want to make available
        return {'variable':variable}
    
  • 转到settings.py,添加context_processors.py

    的路径
    TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'project_name.context_processors.function_name',
            ],
        },
    },
    ]
    
  • 现在可以使用sesttings.py文件提供的所有模板

    <p>here is the {{ variable }}</p>
    

答案 1 :(得分:0)

这里有两种选择。你可以设计一个混合,你可以在你的类声明中包含,并在那里扩展get_context_data,如下所示:

class SidebarMixin():

   def get_context_data(self, **kwargs):
       context = super(SidebarMixin, self).get_context_data(**kwargs)
       context['sidebar'] = mycontext #insert here your stuff

class MyView(View, SidebarMixin):
   def get_context_data(self, **kwargs):
       context = super(MyView, self).get_context_data(**kwargs)
       context['mycontext'] = mycontext #insert here your stuff

否则您可以定义新的模板标签:

@register.inclusion_tag('sidebar.html', takes_context=True)
def sidebar(context):
    return {
        'sidebar': mysidebar_context,
    }