РЕДАКТИРОВАТЬ:
Я вижу, что вы хотите.Я думаю, что вы очень близки к решению, и то, что вы нашли, очень похоже на мой предыдущий ответ.Основное отличие состоит в том, что вы вводите контекст в global.py
файл с TEMPLATE_CONTEXT_PROCESSOR
.
Так что с TEMPLATE_CONTEXT_PROCESSORS
вы вводите контекстные переменные в свой контекстный словарь.Например, если у вас есть Form, тогда ваш контекст выглядит так:
{
'form': {
...
}
}
, в вашем случае вы всегда вводите параметр categories
внутрь, чтобы ваш контекст выглядел следующим образом:
{
'form': {
...
},
'categories': [
{
'title': 'your title 1'
'posts': [...]
},
{
'title': 'your title 2'
'posts': [...]
},
....
]
}
Итак, вы можете получить доступ к этой переменной контекста внутри вашего HTML-кода.
<body>
<div class="page-header">
<form method="POST">
<label>
<select name="Category">
{% for category in categories %}
<option value="{{ category.title }}">{{ category.title }} {{ category.post_set.count }}</option>
{% endfor %}
</select>
</label>
</form>
Поскольку имя переменной в словаре равно ' category ', (и содержит массив ваших категорий), вы должны получить доступ к этой переменной в вашемпетля.Когда вы выполняете итерации по категориям, вы создаете временную переменную с именем category (или любое другое имя) и используете эту переменную для доступа к заголовку и количеству сообщений.
ПРЕДЫДУЩАЯ:
Я не уверен, что вы просите.
Но вам, вероятно, нужно, чтобы список категорий всегда был внутри вашего context_data
.
Это означает, что вы можете подготовить некоторую функцию, которая извлекает всю категорию и создает из нее контекст, например:
def prepare_category_context(context_data):
"""
Function that create context data for all Views classes.
"""
context_data['categories'] = model.Category.objects.all()
return context_data
class myView(generic.EnyViewClass):
"""
Example of the View Class. This could be generic.TemplateView, CreateView,...
The trick is to add context data inside class.
"""
def get_context_data(self, **kwargs):
"""
Here we defined context data that will be used in templates.
We call our function here. But we need to call super first, if we have some form data or any thing else already in context...
"""
context = super().get_context_data(**kwargs)
context = self.prepare_category_context(context)
return context