【问题标题】:How do I add a dynamic base template in django?如何在 django 中添加动态基础模板?
【发布时间】:2019-02-21 16:07:39
【问题描述】:

假设我有一个 base.html 模板。在 base.html 模板中包含菜单栏、固定页脚和内容块。 示例:

base.html

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand mr-0 mr-md-2" href="/">
            <img src="{{ url of an image added in the database that can be changed by the user }}" height="60" class="d-inline-block" alt="site">Site</a>
        <button class="btn btn-link bd-search-docs-toggle d-md-none p-0 ml-3" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNav">
    <ul class="navbar-nav">
    <li class="nav-item">
        <a class="nav-link" href="#">Diário Oficial do PL</a>
    </li>
    <li class="nav-item">
        <a class="nav-link" href="#">Site Oficial do PL</a>
    </li>
    <li>
        <a class="nav-link" href="#">Links Úteis</a>
    </li>
    </ul>
    </div>
<div class="container" style="min-height: calc(100vh - 230px);">
{% block content %}
<!-- Blocl content -->
{% endblock %}
</div>
{% block footer %}
{% endblock %}

home.html

{% extends 'base/base.html' %}
{% load static %}
{% block conteudo %}
<p>Content bla bla bla bla bla </p>
{% endblock %}

models.py

class Orgao(models.Model):
    name = models.CharField(max_length=80)
    logo = models.ImageField()

如何在数据库中获取此图像并在扩展至系统所有页面的 base.html 中显示?

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    您不必在每个视图中都使用 get_context_data。 django 中有一个上下文处理器这样的东西,它专门用于为 Web 应用程序的每个页面提供上下文。 所以,在你的情况下,这将是:

    # context_proccesors.py
    
    from .models import Orgao
    
    def orgao_logo(request):
        orgao = Orgao.objects.filter(name='somename') # or whatever object you need
        return {'logo':orgao.logo}
    

    然后你需要把这个上下文处理器添加到你的settings.py中:

    #settings.py
    
        TEMPLATES = [
            {
                'BACKEND': 'django.template.backends.django.DjangoTemplates',
                'DIRS': [TEMPLATES_DIR],
                'APP_DIRS': True,
                'OPTIONS': {
                    'context_processors': [
                        ....
                        'context_processors.orgao_logo',
                    ],
                },
            },
        ]
    

    最后,您可以通过 context 关键字在模板中使用它:

    <img src="{{logo.url}}">
    

    【讨论】:

    • 令人印象深刻。这正是我所需要的。我不知道。非常感谢您的帮助。
    • 我在 app 文件夹或项目文件夹中创建 context_proccesors.py 文件的位置?
    • @BInjalPatel 约定是在与 manage.py 文件相同的级别上创建 context_proccesors 文件夹。在该文件夹中,您放置您的 some_proccesor.py 文件。然后你在settings.py 中引用它,如'context_proccesors.some_proccesor',如我的回答所示。
    • 我收到这样的错误:ModuleNotFoundError at / No module named 'context_processors'
    • @BInjalPatel 将空的__init__.py 放入context_proccesors 文件夹中。并确保该文件夹位于项目的根目录中
    【解决方案2】:

    您可以在为每个视图返回的上下文中包含图像 url。例如,您可以使用短函数render

    您也可以使用simple tag 直接在模板中返回网址

    【讨论】:

    • 这样每次我创建一个新页面时,我都必须将标签添加到模板中,或者添加一个视图来为每个创建的页面呈现图像。无论页面大小如何,我都只想这样做一次。有没有办法把图片渲染到base,所有从base.html扩展出来的页面,都继承这个图片?
    • 你可以创建一个简单的标签,(如果你还需要渲染一些东西,也可以创建一个包含标签),并将它添加到“base.html”
    猜你喜欢
    • 2019-09-03
    • 2011-09-14
    • 2013-01-21
    • 2014-06-09
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2011-12-22
    相关资源
    最近更新 更多