Использование шаблонных тегов, вероятно, было бы тем путем, который я выбрал бы здесь. У меня была похожая ситуация, когда у меня была календарная информация, отображаемая несколько раз в разных форматах на одной странице. Я справился с этим путем передачи запрашиваемых данных в контекст запроса, а затем просто использовал этот набор запросов в качестве аргумента тега шаблона. В результате вы можете получить синтаксис шаблона:
View
def my_view(request, *args, **kwargs):
yearly_sales_qs = SaleRecord.objects.filter(param=value)
monthly_sales_qs = SalesRecord.objects.filter(param=foo)
return render_to_response( ..., locals(), ... )
Template
{% load data_tags %}
<div class="year">
{% render_data_table for yearly_sales_qs %}
{% render_bar_chart for yearly_sales_qs %}
</div>
<div class="month">
{% render_data_table for monthly_sales_qs %}
{% render_bar_chart for monthly_sales_qs %}
</div>
Так как ты делаешь что-то подобное? Начните с просмотра документации Django на Пользовательские теги шаблонов и фильтры . Начать немного сложнее, чем остальную часть Django, но как только вы это получите, это довольно легко.
- Начните с создания папки "templatetags" в папке вашего приложения.
- Создайте пустой файл " init .py" в этой новой папке
- Добавить расположение этой папки с тегами шаблона в настройку
TEMPLATE_DIRS
в settings.py
(если ее там еще нет)
Поскольку мы будем делать несколько из них, мы можем создать тег базового шаблона, который мы унаследуем, который инкапсулирует наши основные функции ...
data_tags.py (хранится в папке templatetags
)
class DataForTag(tempalte.Node):
@classmethod
def handle_token(cls, parser, token, template):
tokens = token.contents.split()
if tokens[1] != 'for':
raise template.TemplateSyntaxError("First argument in %r must be 'for'" % tokens[0])
if len(tokens) == 3:
return cls(queryset=parser.compile_filter(tokens[2]), template=template)
else:
raise template.TemplateSyntaxError("%r tag requires 2 arguments" % tokens[0])
def __init__(self, queryset=None, template=None):
self.queryset = queryset
self.template = template
def render(self, context):
return render_to_string(self.template, {'queryset':self.queryset})
Затем мы можем создать отдельные теги, которые будут обрабатывать все, что нам нужно ...
@register.tag
def render_bar_chart(parser, token):
return DataForTag.handle_token(parser, token, 'data/charts/barchart.html')
@register.tag
def render_pie_chart(parser, token):
return DataForTag.handle_token(parser, token, 'data/charts/piechart.html')
@register.tag
def render_data_table(parser, token):
return DataForTag.handle_token(parser, token, 'data/table.html')