#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)}
Чтобы активировать этот контекстный процессор, вам нужно сделать несколько вещей:
-
Добавьте приведенный выше код в файл, вызываемый
template_processors.py
в том же месте, что и вашmodels.py
andviews.py
. -
В вашем
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',)
-
Используйте
render
ярлык, который гарантирует правильную передачу контекста.
В ваших представлениях теперь вы можете просто сделать это:
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
В вашем home.html
, теперь вы можете сделать:
{% for name in category_names %}
{{ name }}
{% endfor %}