你如何给wagtail / django页面提供一个自定义网址?

时间:2017-09-07 23:07:26

标签: python django wagtail

wagtail/django如何创建基本wagtail Page model,创建html模板,然后告诉该模型作为特定网址的视图?

from django.db import models
from wagtail.wagtailcore.models import Page

class MyPage(Page):
  title = models.CharField(blank=True, null=True, max_length=255)
  #...

我希望网址像

一样注册
url(r'^monkey/(?P<slug>[A-Za-z0-9]+)$', ...)

但我没有在项目外部存储的公共urls.py文件夹。我尝试使用RoutablePageMixin,但我认为这适用于子页面。我也知道在结构中存储html模板的位置,这不是问题。

2 个答案:

答案 0 :(得分:1)

您可能想要类似的东西:

from django.http import Http404
from django.views import View
from wagtail.core.views import serve

class WagtailPageServeView(View):
    """
    A default way to serve up wagtail pages in urls
    """

    wagtail_slug = None

    def get(self, request, *args, **kwargs):
        if self.wagtail_slug:
            return serve(request, self.wagtail_slug)
        else:
            raise Http404(
                f"WagtailPageServeView missing 'wagtail_slug'. Cannot serve "
                f"request.path: {request.path}"
            )

然后您可以在urls.py中执行以下操作:

urlpatterns += [
    re_path(r'^$', WagtailPageServeView.as_view(wagtail_slug='/'), name='home'),
]

答案 1 :(得分:0)

在Wagtail中,您正在创建页面类型,然后在CMS中创建该页面类型的实例。

即使您只打算使用该页面一次,您仍然需要输入一个类型。按照此逻辑,页面URL是通过页面的父级和slug在CMS内部定义的。通过这些方式,您很可能可以实现您想要的。

如果您想覆盖页面模板并创建自定义网址,则可以覆盖模型上的get_url_parts method

此外,如果您想专门跳过此页面的Wagtail,请记住Wagtail仅基于Django构建。您始终可以创建一个新模块并在该模型中定义URL。如果您检查自己的网站urls.py,则会看到see形网址格式。您可以将其更改为如下所示:

urlpatterns = [ # other urls... url(r'wagtail/', include(wagtail_urls)), url(r'^monkey/', ('monkey_app.urls', 'monkey_app')), ]