Django - контекст, который всегда отображается - PullRequest
0 голосов
/ 14 мая 2018

Я пишу блог - в нем есть меню верхней панели, которое содержит Categories объектов.Проблема в том, что каждое представление в этом блоге должно возвращать context с Categories.objects.all().Есть ли лучший способ решить эту проблему (добавить один и тот же набор запросов в контекст для каждого представления)?Мой код:

models.py

class Category(models.Model):
    name = models.CharField(max_length=60)
    slug = models.SlugField(unique=True, blank=True, null=True)

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Blog</title>  
</head>
<body>
    {% block menu %}
        <div id="menu">
        {% for item in categories %}
            <a href="{% url 'category_detail' item.slug %}">
                <div class="category">{{ item.name }}</div>
            </a>
        {% endfor %}
        </div>
    {% endblock %}

    {% block content %}
    <!-- I want extend only that block in every view -->

    {% endblock %}
</body>
</html>

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Создать класс смешивания, унаследовав ContextMixin

from django.views.generic.base import ContextMixin

class CategoryMixin(ContextMixin):
    """
    A mixin class that adds categories to all the views that use it.
    """

    def get_context_data(self, **kwargs):
        ctx = super(CategoryMixin, self).get_context_data(**kwargs)
        ctx['categories'] = Categories.objects.all()
        return ctx

Теперь в каждом представлении, где вам нужно наследовать категории CategoryMixin

class BlogListView(ListView, CategoryMixin):
    model = Event
    template_name = 'pages/home.html'

    def get_context_data(self, **kwargs):
        ctx = super(BlogListView, self).get_context_data(**kwargs)
        ctx['view_specific'] = 'something'
        return ctx

... 
0 голосов
/ 14 мая 2018

Вы можете отправить его через контекстные процессоры.Просто добавьте файл в свой корневой проект рядом с settings.py, назовите его context_processor.py и внутри вы напишите function с request в качестве аргумента, он должен вернуть dict .

from your_app.models import Category

def global_context(request):
    cateogries = Category.objects.all()
    context = {'categories':categories,}
    return context

тогда вы вызываете его из settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        # codes,
        'OPTIONS':{
             'context_processors':[

                  'django.contrib.auth.context_processors.auth',
                  'django.template.context_processors.debug',
                  'django.template.context_processors.i18n',
                  'django.template.context_processors.media',
                  'django.template.context_processors.static',
                  'django.template.context_processors.tz',
                  'django.contrib.messages.context_processors.messages',                      'django.contrib.messages.context_processors.messages',

                  # Insert your TEMPLATE_CONTEXT_PROCESSORS here 
                  #'project_name.file_name.function_name',
                  'project_name.context_processors.global_context',
             ],
        }
    },
]
...