如何在 django 中添加动态基础模板?

Dan*_*ues 1 django django-templates django-views

假设我有一个 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 %}
Run Code Online (Sandbox Code Playgroud)

主页.html

{% extends 'base/base.html' %}
{% load static %}
{% block conteudo %}
<p>Content bla bla bla bla bla </p>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

模型.py

class Orgao(models.Model):
    name = models.CharField(max_length=80)
    logo = models.ImageField()
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*kur 5

您不必在每个视图中都使用 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}
Run Code Online (Sandbox Code Playgroud)

然后您需要将此上下文处理器添加到您的 settings.py 中:

#settings.py

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [TEMPLATES_DIR],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    ....
                    'context_processors.orgao_logo',
                ],
            },
        },
    ]
Run Code Online (Sandbox Code Playgroud)

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

<img src="{{logo.url}}">
Run Code Online (Sandbox Code Playgroud)