当前位置: 首页 > 面试题库 >

Django视图-首先从调用应用程序的目录加载模板

阳狐若
2023-03-14
问题内容

我尝试在HTML模板上保持某种一致的命名方案。即index.html代表主页面,delete.html代表删除页面,依此类推。但是,app_directories加载程序似乎总是从按字母顺序排列的第一个应用程序加载模板。

有什么办法可以始终始终在调用应用程序的templates目录中首先检查匹配项?

我的相关设置settings.py

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.load_template_source',
    'django.template.loaders.filesystem.load_template_source',
)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates'),
)

我尝试更改的顺序TEMPLATE_LOADERS,但未成功。

根据Ashok的要求进行编辑:

每个应用程序的目录结构:

templates/
    index.html
    add.html
    delete.html
    create.html
models.py
test.py
admin.py
views.py

在每个应用程序的views.py中:

def index(request):
    # code...
    return render_to_response('index.html', locals())

def add(request):
    # code...
    return render_to_response('add.html', locals())

def delete(request):
    # code...
    return render_to_response('delete.html', locals())

def update(request):
    # code...
    return render_to_response('update.html', locals())

问题答案:

原因是app_directories加载程序与将每个应用程序的模板文件夹添加到TEMPLATE_DIRS设置基本相同,例如

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'app1', 'templates'),
    os.path.join(PROJECT_PATH, 'app2', 'template'),
    ...
    os.path.join(PROJECT_PATH, 'templates'),
)

问题是,正如你提到的,index.html将始终在app1 / templates / index.html中找到,而不是其他任何应用程序。没有简单的方法可以魔术地解决此问题,而无需修改app_directories加载程序并使用自省或传递应用程序信息,这变得有些复杂。一个更简单的解决方案:

  • 保持你的settings.py原样
  • 在每个应用程序的模板文件夹中添加带有该应用程序名称的子目录
  • 在“ app1 / index.html”或“ app2 / index.html”等视图中使用模板

举一个更具体的例子:

project
    app1
        templates
            app1
                index.html
                add.html
                ...
        models.py
        views.py
        ...
    app2
        ...

然后在视图中:

def index(request):
    return render_to_response('app1/index.html', locals())

你甚至可以编写包装器来自动在所有视图之前添加应用程序名称,甚至可以扩展为使用自省功能,例如:

def render(template, data=None):
    return render_to_response(__name__.split(".")[-2] + '/' + template, data)

def index(request):
    return render('index.html', locals())

_ name ___。split(“。”)[-2]假定文件在软件包中,因此它将例如’app1.views’转换为’app1’以添加为模板名称。这还假设用户在不重命名模板目录中的文件夹的情况下将永远不会重命名你的应用程序,这可能不是一个安全的假设,在这种情况下,只需将模板目录中的文件夹名称硬编码即可。



 类似资料:
  • 问题内容: 我有一个关于如何从模板HTML按钮调用视图函数的问题?像onclick函数一样?这是模板: 而views.py是: 非常感谢你。 问题答案: 一种选择是,你可以使用 像这样: (删除和) 如果你想加载页面的特定部分,而无需重新加载页面-你可以 和一个听众

  • 问题内容: 有什么办法可以从Django视图进行RESTful api调用吗? 我正在尝试从Django视图沿URL传递标头和参数。我从一个半小时开始搜寻,但是找不到任何有趣的事情。 任何帮助,将不胜感激 问题答案: 是的,当然有。你可以使用urllib2.urlopen,但我更喜欢请求。 请求库是urllib3之上的一个非常简单的API.

  • 我正在使用更新动作栏中的标题 共享视图模型 主要活动观察者 使用下面的代码似乎会在< code>Fragment中创建新的实例(在调试器中检查): 但似乎是这样的 文章参考 这是应该这样做还是我做错了什么? 谢谢你!

  • 所以我使用django视图调用api post方法,但它给了我400个错误 当我遇到csrf禁止错误b4时,im现在使用。我尝试对API本身执行post方法,并使用视图调用API。 使用View:QueryDict:{}[22/jan/2018 18:56:12]“post/api/test/?book=second+&author=ban&date=2018-01-10+08%3a00am ht

  • 我的IDE是Intellij。我尝试了这个文档来学习预加载器,但由于某些原因,预加载器从来没有从我的主类中调用过,甚至它的方法也没有被调用过。