Как добавить динамический базовый шаблон в Django? - PullRequest
0 голосов
/ 17 сентября 2018

Предположим, у меня есть шаблон base.html. В шаблоне base.html содержатся строка меню, фиксированный нижний колонтитул и блок контента. Exemple:

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 голосов
/ 17 сентября 2018

Вам не нужно использовать get_context_data в каждом представлении. В django есть такая вещь, как контекстный процессор, он создан специально для доставки контекста на каждую страницу веб-приложения. Итак, в вашем случае это будет:

# 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}

Затем вам нужно добавить этот контекстный обработчик в ваши настройки.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}}">
0 голосов
/ 17 сентября 2018

Вы можете включить URL-адрес изображения в контекст, который вы возвращаете для каждого просмотра. Например, вы можете использовать короткую функцию render

Вы также можете использовать простой тег для возврата URL-адреса непосредственно в шаблоне

...