Django: как расширить представление на другое представление без копирования и вставки?

У меня есть представление, которое показывает мою панель навигации, я добавляю панель навигации динамически из базы данных, но проблема в том, что я должен добавить тот же самый кусок кода во все мои представления, чтобы текст навигации появился, и это делает мой код таким длинным, есть ли способ автоматически расширить кусок кода, который получает мою навигацию во все представления, так что когда я перехожу на другую страницу, такую как страница о странице, или контакт, или страница профиля, я все еще могу видеть панель навигации. Сейчас я вижу панель навигации только при переходе на страницу index.html

views.py

def index(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

def about_page(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

def contact_page(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

def profile_page(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

ПРИМЕЧАНИЕ. как видно из приведенного выше кода, мне нужно добавить тот же кусок кода, чтобы навигация отображалась на этих страницах.

Если вы используете представления на основе классов, они могут наследоваться друг от друга.

https://docs.djangoproject.com/en/4.0/topics/class-based-views/

Я думаю, вы можете использовать пользовательский контекстный процессор для добавления всех этих данных в ваши шаблоны. Пример:

import models
def index(request):
    """Custom context processor."""
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    
    return {
        'designcat': designcatlist,
        'prglangcat': prglangcatlist,
        'howtocat': howtocatlist,
    }

После создания его или их (потому что вы можете создать только один со всеми данными или несколько: по одному для каждой функции) остается только добавить его в TEMPLATES.OPTIONS.context_processors. В документации объясняется, что жить может каждый, поэтому вы определяете, можно ли поместить в приложение наш собственный пакет. Итак:

TEMPLATES = [
   {
       ...,
       OPTIONS: {
         'context_processors': [
              "other.django.processors",
              "package.processor.index",
          ]
       }
}]

Теперь все значения, возвращаемые процессорами, доступны в шаблонах. Поэтому в своих шаблонах используйте только ключи dict, возвращенные процессором, чтобы вызывать его как в обычном контексте: {{howtocat}}.

Вернуться на верх