Wagtail — как (правильно) получить другие страницы / модели

#python #django #wagtail

#python #django #wagtail

Вопрос:

Использование Wagtail, которое является более подходящим способом получения записей других страниц / моделей.

 # models.py

def get_context(self, request, *args, **kwargs):
    context = super().get_context(request, *args, **kwargs)
    context['children'] = ArticleDetailPage.objects.live().public()[:3]
    return context
  
 # template.html

{% for item in children %}
    <li>{{ item }}</li>
{% endfor %}
  

Или,

 # models.py

def articles(self):
    articles = ArticleDetailPage.objects.live().public()[:3]
    return articles
  
 # template.html

{% for item in page.articles %}
    <li>{{ item }}</li>
{% endfor %}
  

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

Ответ №1:

AFAIW, это просто личные предпочтения. Первый из них более явный, второй сохраняет ваш контекст более чистым. Единственное отличие, о котором я могу думать, заключается в том, что во втором варианте ArticleDetailPage.objects.live().public()[:3] вызывается только тогда, когда вы фактически включаете {{page.articles}} в свой шаблон, что может привести к незначительному повышению производительности, если запрос довольно сложный.

В общем, я склонен переносить такие переменные в свойство, когда либо:

  1. Я знаю, что там есть явная связь. Итак, в этом случае, когда они являются подстраницами страницы, отображающей шаблон. Переменная типа shopping_cart or breadcrumb с меньшей вероятностью будет связана с самой страницей.

или

  1. Переменная используется в других частях моего кода Django / Wagtail, кроме шаблона. Очень возможно, что я хочу получить доступ к статьям страницы откуда-то еще.

В противном случае я просто передаю его непосредственно в контексте.

Комментарии:

1. Спасибо. Я только начинаю работать с Django / Wagtail, поэтому привыкаю к этому. Я прочитал некоторую документацию (* ссылка ниже), пытаясь понять, как она работает под капотом, чтобы узнать, какой способ предпочтительнее, но пока не понимаю его полностью, поэтому подумал, что спрошу. Не могли бы вы уточнить свой второй пункт? Или какие-либо документы для примера? (* ссылка — ( docs.djangoproject.com/en/2.2/_modules/django/template/base ), ( docs.djangoproject.com/en/2.2/ref/templates/api /… ))