Как отобразить детей страницы трясогузки - PullRequest
2 голосов
/ 26 января 2020

Мое требование звучит просто, но я изо всех сил пытаюсь заставить его работать

В моем проекте wagtail у меня есть BlogListingPage, который имеет много дочерних страниц. Я пытаюсь создать список детей на веб-странице. Вот мой код:

models.py

class BlogListingPage(Page):    
    ...
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        context['blog_pages'] = BlogDetailPage.objects.live().child_of(self)
        return context


class BlogDetailPage(Page):
    ...    
    blog_listing = models.ForeignKey(BlogListingPage,
                                     on_delete=models.PROTECT,
                                     blank=True,
                                     null=True,)

views.py

def blog(request):
    url = 'blog/blog_listing_page.html'
    context = {'data': BlogListingPage.objects.all()}
    return render(request, url, context)

blog_listing_page. html

{% block content %}
    {% for blog_listing in data %}
        {% for post in blog_listing.blogdetailpage %}
            <a href="{% pageurl post %}">{{ post.blog_title }}</a>
        {% endfor %}
    {% endfor %}
{% endblock content %}

Я заблудился в тумане страниц джанго / трясогузки / объектов / наборов запросов / всех () / конкретизирован c

Может кто-то пожалуйста, приведите меня к чистой голубой воде?

1 Ответ

4 голосов
/ 27 января 2020

Несколько предложений относительно вашего подхода:

  1. Наличие внешнего ключа от BlogDetailPage до BlogListingPage не является способом Wagtail для организации отношений родитель-ребенок. Все Page объекты уже имеют древовидную иерархию, и вы должны полагаться на нее, иначе вы потеряете всю встроенную обработку дерева, предоставляемую Wagtail.

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

    class BlogListingPage(Page):    
        subpage_types = ['myapp.BlogDetailPage']
    
    class BlogDetailPage(Page):
        parent_page_types = ['myapp.BlogListingPage']
    
  2. Метод get_context() на BlogListingPage запускается только тогда, когда Wagtail обслуживает указанную c страницу в представлении. Он не запускается, когда вы перебираете эти страницы в своем представлении blog. Чтобы получить доступ к детям, вам нужно сделать что-то вроде этого:

    {% for blog_listing in data %}
        {% for post in blog_listing.get_children.live %}
            <a href="{% pageurl post %}">{{ post.blog_title }}</a>
        {% endfor %}
    {% endfor %}
    

    , т. Е. Вам нужно использовать метод get_children() на странице, чтобы получить его детей. live() дополнительно фильтрует это, чтобы исключить неопубликованные страницы. Обратите внимание, что это будет работать только в том случае, если сообщения блога являются дочерними (в смысле дерева страниц трясогузки) страницы листинга. specific() здесь не важно, если вы используете только URL-адрес и заголовок сообщения - это важно, если вы хотите отображать поля, которые являются частью вашей модели, а не базовой Page модели.

...