【问题标题】:Group pages in wagtail在 wagtail 中分组页面
【发布时间】:2018-01-16 17:58:04
【问题描述】:

如何在 wagtail cms 中对页面进行分组?

我的项目中有一个城市页面模型。可访问的 throw /cityname/:

  • www.example.com/london/
  • www.example.com/berlin/
  • www.example.com/newyork/
  • ...

在我的数据库中有数百个城市之后,我在 wagtail cms 中的根视图变得不清楚。我想对所有城市进行分组,我该怎么做?

通常你会创建一个父对象,但在这种情况下,我的父对象是根。我可以以某种方式创建一个虚拟父页面吗?

【问题讨论】:

    标签: wagtail


    【解决方案1】:

    您不能在管理员的资源管理器部分中拥有虚拟父页面,您只能(当前)在其本机树结构中导航/管理页面。

    但是,您可能希望使用modeladmin 提供一个单独的管理员部分,专门用于编辑城市页面。使用modelAdmin 还可以让您在“资源管理器”部分隐藏城市页面类型,并让您对页面的列出、搜索和过滤方式进行大量自定义。

    这是文档中稍作修改的示例。

    # file: myapp/wagtail_hooks.py
    from wagtail.contrib.modeladmin.options import (ModelAdmin, modeladmin_register)
    from .models import CityPage
    
    
    class CityPageModelAdmin(ModelAdmin):
        model = CityPage
        menu_label = 'Cities'  # ditch this to use verbose_name_plural from model
        menu_icon = 'grip'  # change as required
        menu_order = 200  # will put in 3rd place (000 being 1st, 100 2nd)
        add_to_settings_menu = False  # or True to add your model to the Settings sub-menu
        exclude_from_explorer = True # setting to true will exclude pages of this type from Wagtail's explorer view
        list_display = ('title', 'country', 'other_example_field', 'live')
        list_filter = ('live', 'country')
        search_fields = ('title',) # remember trailing comma on single item sets
    
    # Now you just need to register your customised ModelAdmin class with Wagtail
    modeladmin_register(CityPageModelAdmin)
    

    【讨论】:

    • 谢谢,这里可以使用修改功能吗? (和普通的 Page 对象一样?)
    • 是的。编辑界面与通过资源管理器访问基本相同。
    • 我检查了 bakerydemo,但我在管理员中看不到两个模型管理员的“修订”功能; github.com/wagtail/bakerydemo/blob/master/bakerydemo/base/…我必须先激活它吗?我有什么问题吗?
    • 在 bakerydemo - modeladmin 中没有使用 Page 模型,只有 Page 模型有修订。我只是通过设置与上面的答案代码非常相似的 BlogPageAdmin 自己进行了测试,并且一切都按预期工作。当您单击左侧菜单中的项目时,您将进入博客页面列表(或上面答案中的城市页面)。单击任何一个上的编辑,您将进入正常的页面编辑视图,可在右下角访问修订。如果您指的是单击具有“移动/复制/删除/修订”的“更多”下拉菜单的功能,这是可用
    • 使用页面对象可以完美运行!但是还有最后一个问题 => 我将这种方法用于多语言网站:docs.wagtail.io/en/v1.13.1/advanced_topics/i18n/… 我想先选择网站,然后再添加我的“CityPages”。所以我想要的是:首先单击我的单独部分。然后我得到一个我的网站列表(en/; de/, pl/...),然后我想添加一个 CityPage。我该怎么做?
    【解决方案2】:

    Wagtail 中没有虚拟父页面之类的东西,我不确定您是否希望所有城市页面都位于具有多个父级的单父级(例如按国家/地区分组城市等)。我会假设后者,但如果不是这样,请告诉我,我会更新答案。

    所以你有几个选择:

    1) 创建一个CountryPage 作为Homepage 的子对象,并在其下生活所有CityPage。然后您接受该网址将是/france/paris/

    2) 创建一个CountryPage 作为Homepage 的子级,并在其下生活所有CityPage(与选项1 相同),但您也将Homepage 设为RoutablePage,它将为城市页面的内容。

    from django.shortcuts import get_object_or_404
    from wagtail.wagtailcore.models import Page
    from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
    
    
    class Homepage(RoutablePageMixin, Page):
        @route(r'^(\w+)/$', name='city')
        def city(self, request, city_slug):
            city = get_object_or_404(CityPage, slug=city_slug)
            return city.serve(request)
    

    但是,这有一些注意事项: - CityPage 仍可在 /france/paris/ 获得,因此您需要设置规范 URL 以确保没有双重索引。 - CountryPage 仍可在 /france/ 获得,您可能不想要。 - 名称可能会发生冲突。例如,如果您有一个 CountryPageluxembourg 的 slug 和一个 CityPage 与与孩子相同的 slug。当您访问/luxembourg/ 时,您会期望Homepage 将其接收并提供服务器/luxembourg/luxembourg/,但它不会,因为CountryPage 已经在/luxembourg/ 接收了该URL。

    3) 如果您的城市不一定需要是一个页面(它们比其他任何东西都更多的数据持有者并且没有孩子),您可以将它们转换为模型。此模型将在管理界面中显示为 snippetsmodeladmin 并由 Homepage 提供服务(类似于选项 2)。

    from django.shortcuts import get_object_or_404, render
    from wagtail.wagtailcore.models import Page
    from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
    
    
    class Homepage(RoutablePageMixin, Page):
        @route(r'^(\w+)/$', name='city')
        def city(self, request, city_slug):
            city = get_object_or_404(CityModel, slug=city_slug)
    
            context = self.get_context(request, *args, **kwargs)
            context['city'] = city
    
            return render(request, 'city.html', context)
    

    【讨论】:

    • 谢谢。第 3 点对我不起作用,因为我使用这种方法使用多语言站点:docs.wagtail.io/en/v1.13.1/advanced_topics/i18n/…(我需要以某种方式按站点对它们进行分组......)第 1 点不是一个选项,我想使用第 2 点,但是为什么不能只覆盖页面 url?你知道怎么做吗?
    • 另一种方法是使用解决方案 1 并使用 mod_rewrite 施展魔法,但这并不是我真正想要的。为什么覆盖url这么难?
    • 在选项 2 中,无法覆盖 URL,因为这是 Wagtail 用于 URL 解析的顺序。它首先检查真实页面,然后检查“虚拟”页面。 “覆盖 url 如此困难”的原因仅仅是因为 Wagtail 还没有被构建来解决这个问题。 Wagtail 的真实来源是树,因此试图在树上的给定路径上创建页面但在不同的路径上为它们提供服务是违背 Wagtail 的哲学的。
    • 我使用了选项 1) 并通过 .htaccess 限制了访问,并使用 url 编写了我自己的 django 视图来呈现这个特定页面。还有最后一个问题......我怎样才能停止 wagtail 将此页面添加到站点地图?
    • 已解决此问题,如下所述:docs.wagtail.io/en/latest/reference/contrib/sitemaps.html => 定制!如何覆盖 wagtail 中的“实时链接”。它导致被阻止的 url 而不是我自己创建的 ...
    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2017-03-30
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多