Django: поместите функцию Python на все страницы с аккуратным кодом. - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в Python и Django, поэтому у меня есть эти коды:

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('about', views.about, name='about'),
    path('contact', views.contact, name='contact')
]

views.py

menus = [
    {
        "name": "Home",
        "link": "/"
    }, {
        "name": "About",
        "link": "/about"
    }, {
        "name": "Contact",
        "link": "/contact"
    },
]

def gnavi():
    return {'menus': menus}

gnavi.html

<nav class="gnavi">
    <ul>
        {% for menu in menus %}
        <li>
            <a href="{{menu.link}}">
                {{menu.name}}
            </a>
        </li>
        {% endfor %}
    </ul>
</nav>

base.html

{% load static %}<!DOCTYPE html>
<html lang="en">
<head>...</head>
<body>

<header class="header">
    {% include 'inc/gnavi.html' %}
</header>
<main>
  {% block content %}
  {% endblock content %}
</main>
<footer>...</footer>

</body>
</html>

Template Structure:

+ templates
  + inc
    - base.html
    - gnavi.html
  - home.html
  - about.html
  - contact.html
  - ...

Как разместить "gnavi. html" на каждой странице, не вызывая его каждый раз в " def "?

# ! Problem: This code works but needs to be called each time a new page is added !
# -> Which is not very nice !

from django.shortcuts import render
from django.http import HttpResponse

def home(request):
    return render(request, 'home.html', gnavi())

def about(request):
    return render(request, 'about.html', gnavi())

def contact(request):
    return render(request, 'contact.html', gnavi())

? Я хочу код должен вызываться только один раз, но применяться ко всем страницам, включая страницу, которая будет создана в будущем.

1 Ответ

0 голосов
/ 18 июня 2020

вы можете использовать {%extends 'gnavi.html.html'%} на любой странице, которую хотите повторить.

например:

base. html:

{%extends 'gnavi.html.html'%}{% load static %}<!DOCTYPE html>
<html lang="en">
<head>...</head>
<body>

<header class="header">
    {% include 'inc/gnavi.html' %}
</header>
<main>
  {% block content %}
  {% endblock content %}
</main>
<footer>...</footer>

</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...