Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Wagtail-在不使用home_page.html时将博客添加到主页_Django_Customization_Posts_Wagtail - Fatal编程技术网

Django Wagtail-在不使用home_page.html时将博客添加到主页

Django Wagtail-在不使用home_page.html时将博客添加到主页,django,customization,posts,wagtail,Django,Customization,Posts,Wagtail,我没有对所有页面使用Wagtail,而是基于Edge v2将Wagtail添加到现有站点。我已经定制了wagtail的安装,创建了一个新闻应用程序(而不是博客应用程序),并将页面名称更改为NewsIndexPage等。这意味着我在主应用程序文件夹中没有models.py。出于某种原因,它还意味着新闻页面位于pages/news而不是/news 我想在这个主页上显示文章,但已经将名称更改为“来自博客的新闻”,并且没有使用主页模式,我对如何实现这一点感到困惑。我想我应该能够添加到views.py中的

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

我想在这个主页上显示文章,但已经将名称更改为“来自博客的新闻”,并且没有使用主页模式,我对如何实现这一点感到困惑。我想我应该能够添加到views.py中的“context”来实现这一点,但无论我尝试了什么,似乎都不起作用

作为一个新手,我肯定我错过了一些东西,但是我在学习这些东西的过程中得到了很多乐趣,并且非常感谢任何指导

以下是新闻/models.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

重新发布评论中的讨论,因为它解决了问题


关于
NewsIndexPage
的URL,请查看URL.py。我怀疑您有
url(r'pages',include(wagtail\u url))
而不是
url(r'',include(wagtail\u url))
从根目录提供wagtail页面。但是,请确保在所有香草Django路线之后添加它,否则它将拦截所有内容


至于在主页上显示新闻文章,请尝试将
context['news']=NewsPage.objects.live().order_by('-first_published_at')
添加到
get_context_data
。这将在模板中作为
news

提供,关于
NewsIndexPage
的URL,请查看
URL.py
。我怀疑你有
url(r'pages',include(wagtail_url))
而不是
url(r'',include(wagtail_url))
来从根目录提供wagtail页面(注意:确保在所有普通的Django路由之后添加它,否则它会拦截所有内容)。至于在主页上显示新闻文章,请尝试
上下文['news']=NewsPage.objects.live().order_by('-first_published_at').specific()
谢谢,url工作了,但NewsPage对象没有。第一个问题是“.specific()上的代码出错。当我删除该代码时,它没有出错。我在主页{%for news in page.news%}中使用下面的代码{{news.body}{%endfor%}有什么想法吗?你应该使用
news
而不是
page.news
。这很有效-想提出这个作为答案,这样我就可以标记它了?