Можно ли использовать теги шаблонов Django как шаблонные шаблоны Django? - PullRequest
0 голосов
/ 26 сентября 2019

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

Файлы JSON содержат информацию о конфигурации конкретного продукта.Я использую язык шаблонов Django в строках в файлах JSON, чтобы у каждого продукта была своя собственная логика для создания идентификаторов конкретных продуктов.Он прекрасно работает с вызовами из языка шаблонов Django.

У id_template есть вызов метода модели get_next_policy_id:

{
    "model": "some name",
    "product_id": "some product name",
    "id_template": "{{ policy.get_next_product_id }}"
}

Вот соответствующий код из модели продукта.Вы можете увидеть метод, который предоставляет идентификатор, и метод сохранения условно использует его.

class Policy():
    [...]
    def get_next_policy_id_risk_strategies(self):
        policy_num = -1
        sequence_name = self.product.product_id + '-' + self.source_application.form["state"]
        if self.source_application.form["state"] == "NY":
            policy_num = get_next_value(sequence_name, initial_value=200_000)

        elif self.source_application.form["state"] == "IA":
            policy_num = get_next_value(sequence_name, initial_value=400_000)
        else:
            sequence_name = self.product.product_id
            policy_num = get_next_value(sequence_name, initial_value=300_000)

        policy_id = self.product.product_id + "-" + str(policy_num)
        return policy_id

Это прекрасно работает.Однако я бы хотел, чтобы в модели не было кода для конкретного продукта.Я мог бы сделать это почти полностью на языке шаблонов Django, но требования к идентификатору продукта, они последовательно меняются в зависимости от состояния.Итак, get_next_value рисует из постоянной последовательности в базе данных.Таким образом, я хотел бы переместить условную логику в файл JSON.

Однако, вызываемые элементы не принимают параметров.И мне нужно передать начало последовательности и состояние в качестве параметров для генерации идентификатора.Поскольку теги могут принимать параметры, я решил использовать простые теги, которые могут принимать параметры.Наряду с условными шаблонными языками.Я думал, что у меня должна быть строка шаблона:

{
   "id_template": "{{ product.product_id }}-{% if product.source_application.form.state == \"NY\" %}{{ product.get_next_product_id "NY" 200000 }}{% elif product.source_application.form.state == \"IA\" %}{{ product.get_next_product_id "IA" 400000 }}{% else %}{{ product.get_next_product_id "other" 300000 }}{% endif %}"
}

Затем в модели я бы поместил следующий код:

    @register.simple_tag(name="get_next_product_id")
    def get_next_product_id(self, state, initial_value):
        sequence_name = self.product.product_id + "-" + self.source_application.form["state"]
        return get_next_value(sequence_name, initial_value=initial_value)

К сожалению, я получаюошибка из этого:

E           django.template.exceptions.TemplateSyntaxError: Could not parse the remainder: ' "NY" 200000' from 'get_next_product_id "NY" 200000'

Я думал, что простые теги могут иметь аргументы.Это ошибочно?

Поскольку строка шаблона не анализируется, я упростил строку до следующего:

{
   "id_template": "{{ product.get_next_product_id "NY" 200000 }}"
}

Но ошибка остается той же.Удаление кавычек вокруг "NY" не имеет никакого эффекта.

Вопрос:

Возможно ли то, что я пытаюсь сделать, используя теги шаблонов Django?И, если нет, есть ли другой способ вывести логику для конкретного продукта из модели?

1 Ответ

1 голос
/ 26 сентября 2019

Нет, это совсем не так, как это работает.Тег шаблона не может быть методом на модели.Если вы хотите определить тег шаблона, он должен находиться в файле внутри каталога templatetags вашего приложения, и вам нужно вызывать его с синтаксисом тега {% ... %}.Конечно, из-за этого он не может принять self, вам нужно будет явно передать продукт.

Так, например, в templatetags / my_tags.py:

@register.simple_tag(name="get_next_product_id")
def get_next_product_id(product, state, initial_value):
    sequence_name = product.product_id + "-" + product.source_application.form["state"]
    return get_next_value(sequence_name, initial_value=initial_value)

затемв шаблоне:

{% load my_tags %}
...
{% get_next_product_id product "NY" 200000 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...