代码之家  ›  专栏  ›  技术社区  ›  Steve

Wagtail-在不使用home_页面时将博客添加到主页。html

  •  1
  • Steve  · 技术社区  · 8 年前

    我没有对所有页面使用Wagtail,而是基于Edge v2将Wagtail添加到现有网站。我已经定制了wagtail的安装,创建了一个新闻应用程序(而不是博客应用程序),并将页面名称更改为NewsIndexPage等。这意味着我没有模型。py在主应用程序文件夹中。出于某种原因,这也意味着新闻页面位于pages/news而不是/news。

    我想在这个主页上显示帖子,但已经把名字改成了博客上的新闻,而不是使用主页模式,我对如何实现这一点感到困惑。我想我应该能够在视图中添加“上下文”。我很乐意做到这一点,但无论我做了什么,似乎都不管用。

    以下是新闻/模型。py:

    from django import forms
    from django.db import models
    
    # New imports added for ClusterTaggableManager, TaggedItemBase, MultiFieldPanel
    
    from modelcluster.fields import ParentalKey, ParentalManyToManyField
    from modelcluster.contrib.taggit import ClusterTaggableManager
    from taggit.models import TaggedItemBase
    
    from wagtail.wagtailcore.models import Page, Orderable
    from wagtail.wagtailcore.fields import RichTextField
    from wagtail.wagtailadmin.edit_handlers import FieldPanel, InlinePanel, MultiFieldPanel
    from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
    from wagtail.wagtailsearch import index
    from wagtail.wagtailsnippets.models import register_snippet
    
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    @register_snippet
    class NewsCategory(models.Model):
        name = models.CharField(max_length=255)
        icon = models.ForeignKey(
            'wagtailimages.Image', null=True, blank=True,
            on_delete=models.SET_NULL, related_name='+'
        )
    
        panels = [
            FieldPanel('name'),
            ImageChooserPanel('icon'),
        ]
    
        def __str__(self):
            return self.name
    
        class Meta:
            verbose_name_plural = 'news categories'
    
    
    class NewsIndexPage(Page):
        intro = RichTextField(blank=True)
    
        def get_context(self, request):
            context = super(NewsIndexPage, self).get_context(request)
    
            # Get the full unpaginated listing of resource pages as a queryset -
            # replace this with your own query as appropriate
            blogpages = self.get_children().live().order_by('-first_published_at')
    
            paginator = Paginator(blogpages, 6) # Show 6 resources per page
    
            page = request.GET.get('page')
            try:
                blogpages = paginator.page(page)
            except PageNotAnInteger:
                # If page is not an integer, deliver first page.
                blogpages = paginator.page(1)
            except EmptyPage:
                # If page is out of range (e.g. 9999), deliver last page of results.
                blogpages = paginator.page(paginator.num_pages)
    
            # make the variable 'resources' available on the template
            context['blogpages'] = blogpages
    
            return context
    
    
    class NewsPageTag(TaggedItemBase):
        content_object = ParentalKey('NewsPage', related_name='tagged_items')
    
    class NewsTagIndexPage(Page):
    
        def get_context(self, request):
    
            # Filter by tag
            tag = request.GET.get('tag')
            blogpages = NewsPage.objects.filter(tags__name=tag)
    
            # Update template context
            context = super(NewsTagIndexPage, self).get_context(request)
            context['blogpages'] = blogpages
            return context
    
    class NewsPage(Page):
        date = models.DateField("Post date")
        intro = models.CharField(max_length=250)
        body = RichTextField(blank=True)
        tags = ClusterTaggableManager(through=NewsPageTag, blank=True)
        categories = ParentalManyToManyField('news.NewsCategory', blank=True)
    
        def main_image(self):
            gallery_item = self.gallery_images.first()
            if gallery_item:
                return gallery_item.image
            else:
                return None
    
        search_fields = Page.search_fields + [
            index.SearchField('intro'),
            index.SearchField('body'),
        ]
    
        content_panels = Page.content_panels + [
            MultiFieldPanel([
                FieldPanel('date'),
                FieldPanel('tags'),
                FieldPanel('categories', widget=forms.CheckboxSelectMultiple),
            ], heading="News information"),
            FieldPanel('intro'),
            FieldPanel('body'),
            InlinePanel('gallery_images', label="Gallery images"),
        ]
    
    class NewsPageGalleryImage(Orderable):
        page = ParentalKey(NewsPage, related_name='gallery_images')
        image = models.ForeignKey(
            'wagtailimages.Image', on_delete=models.CASCADE, related_name='+'
        )
        caption = models.CharField(blank=True, max_length=250)
    
        panels = [
            ImageChooserPanel('image'),
            FieldPanel('caption'),
        ]
    

    在mysite/views中。py我定义了主页:

    from django.views import generic
    from contact.forms import ContactForm
    
    class HomePage(generic.TemplateView):
        template_name = "home.html"
    
        def get_context_data(self, *args, **kwargs):
            context=super(HomePage, self).get_context_data(*args, **kwargs)
            context['form'] = ContactForm
    
            return context
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Loïc Teixeira    8 年前

    关于 NewsIndexPage 看看URL。py。我怀疑你有 url(r'pages', include(wagtail_urls)) url(r'', include(wagtail_urls)) 对于从根提供的Wagtail页面。然而,请确保在所有香草Django路线之后添加它,否则它将拦截所有内容。

    context['news'] = NewsPage.objects.live().order_by('-first_published_at') get_context_data . 这将在模板中提供 news