如何在 wagtail HTML 模板中使用 rooutablepageurl 标签

How to use routablepageurl tag in wagtail HTML template

我复习了 official docs 好几遍,但仍然对如何准确使用 routablepageurl 标签感到困惑。

以下来自官方文档

wagtail.contrib.routable_page.templatetags.wagtailroutablepage_tags.routablepageurl(context,page, url_name, *args, **kwargs)

routablepageurl is similar to pageurl, but works with pages using RoutablePageMixin. It behaves like a hybrid between the built-in reverse, and pageurl from Wagtail.

page is the RoutablePage that URLs will be generated from.

url_name is a URL name defined in page.subpage_urls.

Positional arguments and keyword arguments should be passed as normal positional arguments and keyword arguments.

Q1:需要的参数context是如何提供的?

Q2: pageurl_name 究竟代表什么?我没有在 page 模型中看到属性 (subpage_url)。官方文档解释很混乱。

问题 3: 为什么有时 category.slug 用作 routablepageurl 模板标签的参数,如 this blog post.[=33= 中所示]

<a href="{% routablepageurl blog_page "post_by_category" category.slug %}">{{ category.name }}</a>

概览

routablepageurl template tag 的文档部分非常短,由于大量引用了 Wagtail 和 Django 中的概念,因此可能让人觉得有点混乱。

让我们解压这条线:

routablepageurl is similar to pageurl, but works with pages using RoutablePageMixin. It behaves like a hybrid between the built-in reverse, and pageurl from Wagtail.

  • 首先,这是一个 custom template tag 函数,它以特定的顺序获取一些已知的 arguments/params ,可用于模板标签。这里要注意的重要一点是 context 是传递到模板标记函数调用中的东西,但在使用模板标记时不必显式传递它。
  • 理解这一点需要稍微了解 Django 的 URL 系统是如何工作的,最好通读一下关于这个主题的 Django 文档 https://docs.djangoproject.com/en/3.2/topics/http/urls/
  • pageurl 这里是对具有类似行为的不同模板标签的引用,您可以查看 pageurl template tag.
  • 的文档
  • routablePageMixin 是一个 Page mixin,允许使用多个子页面路由,每个子页面路由的名称都带有装饰器,如 @route(r'^past/$').
  • 的行为类似于 reverse 是对 django.urls.reverse 函数的引用,该函数采用 URL 名称并将 return URL。 Reverse 提供了一种方法,不仅可以根据名称获取 URL,还可以传递参数,这将根据这些参数构建完整的 URL。
  • 在所有这些参考文献中,当您声明 URL 模式(例如所有 'blog/DD-MM-YYYY' 页面)时,name is also a Django concept 的概念会在其他地方引用它们。

具体答案

Q1:需要的参数context是如何提供的?

  • context默认为所有模板标签函数调用提供。

Q2:pageurl_name到底代表什么?

  • page 是模态实例,这将是使用 RoutablePageMixin.
  • page
  • url_name 是页面中定义的 URL 模式的名称,这可能有点不清楚,但它是用于创建子路由的函数名称,在下面的代码示例(来自文档),url 名称将是 current_events.
class EventIndexPage(RoutablePageMixin, Page):
    #...

    @route(r'^$') # will override the default Page serving mechanism
    def current_events(self, request):
        """

Q3:为什么category.slug可以作为这个模板标签的参数

  • 这是将额外的 params/arguments 传递给模板标记的示例,这些又传递给 URL 解析器系统以构建 URL.
  • 例如,在下面的代码片段中(来自博客 post)如果 category.slug 是 'coffee shops'(一个 category),就会发生这种情况:
    • 给定标签用法<a href="{% routablepageurl blog_page "post_by_category" category.slug %}">{{ category.name }}</a>
    • blog_page 将是一个变量,即当前 page 实例
    • "post_by_category"表示找到名称(方法名)为post_by_category的URL子路由。
    • 之后的任何其他参数将用于基于 URL 模式构建 URL,假设 category.slug 是 'coffee-shops'(slug 是URL 类别 'Coffee Shops' 的有效字符串)。
    • 在下面的代码中,模式是 r'^category/(?P<category>[-\w]+)/$',其中 <category>(尖括号)是一个变量用法,URL 解析器将注入 slug 并构建一个 URL 'category/coffee-shops'
    • 的路径
class BlogPage(RoutablePageMixin, Page):
    description = models.CharField(max_length=255, blank=True,)

    #...
    
    @route(r'^category/(?P<category>[-\w]+)/$')
    def post_by_category(self, request, category, *args, **kwargs):
        self.search_type = 'category'
  • 重要的是要了解任何关键字参数或参数都可以传递给模板标签,这些值将依次传递给读取 URL 模式的 URL 解析器语法并尝试根据这些参数在模式中的使用方式构建 URL。