如何在Django中添加动态基本模板?

时间:2018-09-17 17:12:13

标签: django django-templates django-views

假设我有一个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中?

2 个答案:

答案 0 :(得分:2)

您不必在每个视图中都使用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}}">

答案 1 :(得分:1)

您可以在每个视图返回的上下文中包含图像URL。例如,您可以使用简短功能render

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