0

我正在尝试为所有应用程序创建一个模板,但具有不同的基础(与应用程序相关)。

我正在使用 django_hosts:

主机.py:

from django_hosts import patterns, host

host_patterns = patterns('',
        host(r'app1', 'app1.urls', name = 'app1'),
        host(r'(app2|application2)','app2.urls', name = 'app2'),
)

树:

templates/document.html
app1/templates/app1/base.html
app2/templates/app2/base.html

模板/document.html:

{% extends base %}

这个想法是:

当我去时,http://app1.example.com/document/我会看到templates/document.html扩展名app1/templates/app1/base.html,如果我去http://app2.example.com/document/http://application2.example.com/document/扩展名app2/templates/app2/base.html

一般来说,如果我在

app1/views.py:

 (...)
       context={ 'base' : 'app1/base.html' }
    return render(request,'document.html', context)

应用程序2/views.py:

   (...)
        context={ 'base' : 'app2/base.html' }
    return render(request,'document.html', context)

但我想从每个视图的 def 中删除上下文“基础”。

我不能使用app1/context_processors.pyand app2/context_processors.py,因为它会覆盖自己,因为 context_processors 是全局的而不是应用程序本地的。

有个想法:

#main/contexts.py
from django.core.urlresolvers import resolve
def appname(request):
    return {'appname': resolve(request.path).app_name}

但我没有包含包含的 urls.py,因为我有主机定义....

4

2 回答 2

0

这比我想象的要容易...

context_processors.py:

def appname(request):   
    return {'appname': request.host.name }

但是5个小时的搜索丢失了......

于 2020-12-19T00:59:32.737 回答
0

我可以想到两种方法:

方法一

如果您只是想让您的视图不那么冗长,您可以做的一件事是创建自己的render函数,在适当的上下文中添加,您需要为每个应用编写这些函数之一。例如

# app1.views
from django.shortcuts import render as _render

def render(request, template_name, context=None, *args, **kwargs):
    if context is None:
        context = {}
    context = {**context, 'base' : 'app1/base.html'}
    return _render(request, template_name, context, *args, **kwargs)

def some_view(request):
    ....
    return render(request, 'document.html', context)

这显然假设您的所有视图都在一个文件中,但是您可以utils.py为每个应用程序创建一个文件,然后只需render从相应的utils.py.

方法二

您使用上下文处理器和使用 resolve 的想法实际上可行。resolve接受一个可选参数urlconf,并查看 django-hosts 的中间件(此处),它看起来像是在请求中设置了它,因此您可以执行以下操作:

resolve(request.path, urlconf=request.urlconf).app_name

(我没有测试过以上,但我不明白为什么它不起作用)

于 2020-12-19T00:35:17.463 回答