Django + decorators: добавление контекста в шаблон на основе критериев - PullRequest
1 голос
/ 18 января 2010

Я не уверен, что декораторы - лучший способ сделать это, но я отказался от идеи использования контекстных процессоров, и я не уверен, что промежуточное ПО - то, что я хотел бы.

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

Я легко выяснил, как это сделать на стороне обработки / бэкэнда, но как мне это сделать?передать такой контекст в шаблон без редактирования тонны моих функций просмотра?Я просто хочу передать в мои функции декоратор, который проверит дату передаваемого экземпляра и добавит некоторый контекст в шаблон, чтобы я мог отобразить небольшое сообщение, сообщающее пользователю, почему кнопка «Сохранить» отключена.

Надеюсь, мой вопрос имеет смысл.Заранее спасибо.

1 Ответ

4 голосов
/ 19 января 2010

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

#yourapp/templatetags/business_tags.py

from django import template
register = template.Library()

class BusinessNode(template.Node):
  def __init__(self, instance, varName):
    self.instance, self.varName=instance, varName

  def render(self, context):
    instance=template.Variable(self.instance).render(context)
    if instance.passes_some_test():
      context[self.varName]='Some message'
    else:
      context[self.varName]="Some other message"
    return ''
@register.tag
def business_check(parser, token):
  bits=token.split_contents()
  if len(bits)==5:
    return BusinessNode(bits[2],bits[4])
  return ''

Тогда в вашем шаблоне

{% load business_tags %}

{% business_check for someVar as myMessage %}
{{myMessage}}

Это одинаково хорошо работает для вставки данных других типов в контекст.

...