Теги шаблонов Django forloop

#python #django

#python #django

Вопрос:

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

tags.py

 from django import template
from loadprograms import dbcontext

register = template.Library()


    @register.simple_tag
    def get_category():
        x = dbcontext.DBContext()
        results = x.executequery("Select name from Categories")
        categories = [each[0] for each in results]
        return categories 
  

код шаблона

 {% load category_tags %}
{% get_category %}
{% for each in get_category %}
    {{ each }}
{% endfor %}
  

{% get_category %} печатает все категории без каких-либо проблем, но stmt цикла for
, который перебирает результаты, не работает

В чем может быть проблема?

Комментарии:

1. Это ваш фактический тег?

2. ДА.. Это фактический тег.

3. Почему вы используете необработанный SQL?? Почему бы не использовать ORM?

Ответ №1:

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

Обработчик контекста шаблона — это просто метод, который добавляет контекст запроса, возвращая словарь. Думайте об этом как о функции просмотра, которая просто возвращает контекст.

 from .models import Categories

def cat_names(request):
    return {'category_names': Category.objects.values_list('name', flat=True)}
  

Чтобы активировать этот контекстный процессор, вам нужно сделать несколько вещей:

  1. Добавьте приведенный выше код в файл, вызываемый template_processors.py в том же месте, что и ваш models.py and views.py .

  2. В вашем settings.py , добавьте полное имя метода к TEMPLATE_CONTEXT_PROCESSORS настройке, убедившись, что вы не переопределяете значения по умолчанию. Чтобы сделать это легко, сначала импортируйте настройки по умолчанию, а затем добавьте к ним:

     from django.conf.default_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP
    
    TEMPLATE_CONTEXT_PROCESSORS = TCP   ('yourapp.template_processors.cat_names',)
      
  3. Используйте render ярлык, который гарантирует правильную передачу контекста.

В ваших представлениях теперь вы можете просто сделать это:

 from django.shortcuts import render

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

В вашем home.html , теперь вы можете сделать:

 {% for name in category_names %}
   {{ name }}
{% endfor %}