Глобальная переменная Django для base.html - PullRequest
0 голосов
/ 29 мая 2018

Я реализовал глобальную переменную, но я действительно не знаю, как получить к ней доступ.Примеры, которые я нашел, немного сбивают с толку.

models.py

...
# Categorys of Post Model
class Category(models.Model):
    title = models.CharField(max_length=255, verbose_name="Title")


    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"
        ordering = ['title']

    def __str__(self):
        return self.title

#Post Model
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField(max_length=10000)
    category = models.ForeignKey(Category, verbose_name="Category", on_delete=models.CASCADE, null=True)

...

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"Post.global.category_dropdown",
)

global.py

from .models import Category

def category_dropdown(request):
    categories = Category.objects.all()
    return {'categories': categories}

base.html:

<body>
    <div class="page-header">
        <form method="POST">
            <label>
                <select name="Category">
                    {% for global in category_dropdown %}
                        <option value="{{ categorie.title }}">{{ categorie.title }} {{ categorie.post_set.count }}</option>
                    {% endfor %}
                </select>
            </label>
        </form>
  1. Я не совсем уверен, еслион реализован правильно.
  2. Я не знаю, как получить доступ к глобальной вар.в шаблоне

В конце это должно отобразить выпадающее меню в заголовке каждой страницы, которое получает его значение из базы данных, как вы можете видеть в models.py

заранее спасибо

1 Ответ

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

РЕДАКТИРОВАТЬ:

Я вижу, что вы хотите.Я думаю, что вы очень близки к решению, и то, что вы нашли, очень похоже на мой предыдущий ответ.Основное отличие состоит в том, что вы вводите контекст в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...