Рендеринг трясогузки ссылочных объектов в InlinePanel - PullRequest
0 голосов
/ 17 февраля 2020

В моей статье PageModel у меня есть InlinePanel('technologies', label="Technologies"),, который загружает ArticlesPageTechnologies(Orderable), который использует PageChooserPanel('technologies', 'rb_tech_portfolio.TechnologiesPage'),.

Это все работает хорошо. Но я хочу перечислить ссылки на эти ссылочные страницы, но я не могу найти лучший способ сделать это. Самое близкое, что я получил, к {% for technology in page.technologies.all %}, но это просто дает мне объект, который соединяет двухстраничные модели, тогда как я хочу ссылочный объект. Это все готово для использования, или мне нужно сделать дополнительный запрос в def_context, чтобы сделать это?

Спасибо, Дэн


Технологии Inline панель

class ArticlesPageTechnologies(Orderable):
    page = ParentalKey(ArticlesPage, on_delete=models.CASCADE, related_name='technologies')

    technologies = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
    )

    panels = [
        PageChooserPanel('technologies', 'rb_tech_portfolio.TechnologiesPage'),
    ]

Модель страницы для статей

class ArticlesPage(Page):
    body = RichTextField(blank=True)
    thumbnail = models.ForeignKey(
        'wagtailimages.Image',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
        ImageChooserPanel('thumbnail'),
        InlinePanel('technologies', label="Technologies"),
    ]

    def get_context(self, request, *args, **kwargs):
        """Adding custom stuff to our context."""
        context = super().get_context(request, *args, **kwargs)
        # Get all posts
        posts = ArticlesPage.objects.live().public().order_by('-date')[:5]

        context["posts"] = posts
        return context

Шаблон страницы статей

{% extends "base.html" %}

{% block body_class %}template-article{% endblock %}

{% block content %}
{% comment %}
{% for post in posts %}
{{ post.url }}
{% endfor %}
{% endcomment %}

<div class="row">
  <div class="col-9 col-12-medium">
    <section>
      <header>
        <h1>{{ page.title }}</h1>
      </header>
      {{ page.body|safe }}
    </section>
    </ul>
  </div>
  <div class="col-3 col-12-medium">

    <!-- Sidebar -->
    <section>

      <header>
        <h2>Technologies</h2>
      </header>

      <ul class="link-list">
        {% for technology in page.technologies.all %}
          <li>{{ technology.select_related.title }}</li>
        {% endfor %}
      </ul>

    </section>

  </div>
</div>

{% endblock content %}

1 Ответ

0 голосов
/ 18 февраля 2020

Это должно работать:

 {% for technology in page.technologies.all %}
     <li>{{ technology.technologies.title }}</li>
 {% endfor %}

Если это выглядит немного запутанно, это потому, что ваша модель ArticlesPageTechnologies использует technologies в слегка запутанном виде. Каждый объект ArticlesPageTechnologies связывает с вашей страницей технологию single , а не несколько - множественность достигается при наличии нескольких таких объектов в вашем InlinePanel.

Я бы предложил переименовать внешний ключ tehnologies в technology, чтобы отразить этот факт. Если вы сделаете это, то ваш шаблон logi c (функционально идентичный вышеописанному, но с более понятными именами переменных) будет:

 {% for page_technology in page.technologies.all %}
     <li>{{ page_technology.technology.title }}</li>
 {% endfor %}
...