2016-01-11 3 views
0

У меня возникла проблема с созданием ссылки блога Post на его собственную страницу контента в wagtail. В моих моделях у меня есть два класса страниц, BlogPage и IndexPage. Класс BlogPage используется для создания сообщения в блоге, а класс IndexPage используется для отображения списка сообщений в блоге.Невозможно связать сообщение в блоге с его страницей контента в Wagtail

Пожалуйста, смотрите модели ниже:

from django.db import models 

from modelcluster.fields import ParentalKey 

from wagtail.wagtailcore.models import Page, Orderable 
from wagtail.wagtailcore.fields import RichTextField 
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, InlinePanel 
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel 
from wagtail.wagtailsearch import index 


class IndexPage(Page): 
    intro = RichTextField(blank=True) 

    def child_pages(self): 
     return BlogPage.objects.live() 


    content_panels = Page.content_panels + [ 
     FieldPanel('intro', classname='full'), 
    ] 

    subpage_types = ['blog.BlogPage'] 


class BlogPage(Page): 
    date = models.DateField("Post date") 
    intro = models.CharField(max_length=250) 
    body = RichTextField(blank=True) 



    search_fields = Page.search_fields + (
    index.SearchField('intro'), 
    index.SearchField('body'), 
    ) 

    content_panels = Page.content_panels + [ 
    FieldPanel('date'), 
    FieldPanel('intro'), 
    FieldPanel('body', classname="full") 
    ] 

Моя задача состоит в том, что я не могу понять, как связать записи блога на главной странице своей собственной странице. Нужно ли создавать отдельную страницу и шаблон html для этого? или что может быть лучшим подходом для решения этой проблемы?

ответ

2

Вы можете создать шаблон включения (ему не нужна модель) - давайте назовите его truncated_blog_post.html - который затем вы можете вызвать в своем шаблоне index_page.html. Это будет рекомендуемый подход, поскольку использование шаблона include для публикации дает возможность использовать его в любом месте, где вам нужно отображать список (усеченных обычно) сообщений: если вы хотите, например, сообщения под определенным тегом.

truncated_blog_post.html

{% load wagtailcore_tags %} 

<article> 
    <a href="{% pageurl blog %}"><h2>{{ blog.title }}</h2></a> 
    <p>{{ blog.date }}</p> 
    <p>{{ blog.body|truncatewords:40 }}</p> 
</article> 

pageurl Использование тега из wagtailcore_tags вы получите относительный URL этого блога. Очевидно, что если вы не хотите создавать шаблон include для усеченного сообщения, вы можете поместить код article с blog_post.html непосредственно в цикле for в шаблоне index_page.html.

И ваш index_page.html шаблон:

.... 
{% for blog in blogs %} 
    {% include "path/to/includes/truncated_blog_post.html" %} 
{% empty %} 
    No posts found 
{% endfor %} 
.... 

Для этой работы вы должны изменить IndexPage модель:

class IndexPage(Page): 
    intro = RichTextField(blank=True) 
    @property 
    def blogs(self): 
     blogs = BlogPage.objects.live() 
     return blogs 
    def get_context(self, request): 
     # Get blogs 
     blogs = self.blogs 

     # Update template context 
     context = super(IndexPage, self).get_context(request) 
     context['blogs'] = blogs 
     return context 

    content_panels = Page.content_panels + [ 
    FieldPanel('intro', classname='full'), 
    ] 
    subpage_types = ['blog.BlogPage'] 
+0

Это решение помогло мне решить мою проблему, очень хорошо объяснил и подробный ответ, спасибо. – Leo

+0

Тогда вы можете отметить его как принятый, чтобы закрыть вопрос? – doru

+0

Этот ответ был отмечен как принятый. – Leo