Шаблонные теги против контекста в django - PullRequest
0 голосов
/ 11 января 2020

после работы с django я вижу, что существует 2 способа передачи данных на страницу html. Как если бы у меня была модель под названием «Продукты», я мог бы либо

views.py

context = {
        'products' : Products.objects.all()
    }

    return render(request, 'products/product_page.html', context)

product_page.html

{% for post in posts %}
    //do stuff with {{post}}
{% endfor %}

, либо я могу сделать

product_tags.py

register = template.Library()

@register.simple_tag
def get_Products():
    return Products.objects.all()

product_page.html

{% load product_tags %}
{% get_Products as elections %}
    //do stuff with {{elections}}

Один путь лучше другого?

1 Ответ

0 голосов
/ 11 января 2020

Возможный дубликат:

стек Q / A

В вашем примере, если вы используете его только один раз, я предполагаю, что это та же производительность.

Но если для какого-то случая вам придется "get_Products" дважды, это пустая трата доступа к БД.

Контекст для меня - это обычный способ. Писать теги шаблонов можно только тогда, когда мне нужно получить что-то очень конкретное c, например, запрос с 3 различными моделями, для которых требуется l oop.

. Посмотрите на мой пример:

@register.simple_tag
def get_skipper_in_training_finish_datetime(training, user):
   skipper = training.get_skipper_in_training(user)
   if skipper:
       return skipper.finish_datetime

У меня есть 3 разные модели в запросе активности, и только у одной есть "finish_datetime"

Использует свой вид со всеми моими тегами шаблона для этого приложения

{% load utils %}

{% regroup activities by start_date|date:'d-m-Y' as activities_by_date %}
    {% for start_date in activities_by_date %}

       {% for activity in start_date.list %}
          ...

          {% if "Training" in activity.model_name %}
             <script>
                 {% get_skipper_in_training_finish_datetime activity user as skipper_finish %}
                 document.write($.format.toBrowserTimeZone("{{ skipper_finish |date:'c' }}", "HH:mm:ss"))
             </script>
          {% elif activity.end_date %}
              <script>document.write($.format.toBrowserTimeZone("{{ activity.end_date|date:'c' }}", "dd-MM-yyyy"))</script>
          {% else %}
             -
          {% endif %}

        ...

       {% endfor %}

       ...

    {% endfor %}

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

Пользовательские теги и фильтры шаблонов

Но, как вы можете видеть, это вопрос логики c и сложных использование модели.

Надеюсь, что смогу помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...