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/ 获得,您可能不想要。
- 名称可能会发生冲突。例如,如果您有一个 CountryPage 与 luxembourg 的 slug 和一个 CityPage 与与孩子相同的 slug。当您访问/luxembourg/ 时,您会期望Homepage 将其接收并提供服务器/luxembourg/luxembourg/,但它不会,因为CountryPage 已经在/luxembourg/ 接收了该URL。
3) 如果您的城市不一定需要是一个页面(它们比其他任何东西都更多的数据持有者并且没有孩子),您可以将它们转换为模型。此模型将在管理界面中显示为 snippets 或 modeladmin 并由 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)