首页 > 解决方案 > 带有 .html 扩展名的 Django 平面页面

问题描述

我正在尝试设置可以通过 url 访问的 django 平面页面,/pages/page1.html而不是/pages/page1.

遵循flatpages 文档,而不是 flatpages 中间件,在根目录中使用了这个代码urls.py(在同一个文件夹中settings.py):

re_path('pages/.*\.html$', include('django.contrib.flatpages.urls')), 

但这会导致 404 错误。

我尝试将扩展名指定为非捕获组:

re_path('pages/.*(?:\.html)$', include('django.contrib.flatpages.urls')),

但我仍然得到一个404。

.html拥有平面页面后缀的正确方法是什么?

标签: djangourldjango-flatpages

解决方案


你不能用include那种方式。匹配的.*部分将被简单地丢弃,而不是传递给平面视图。

但是你可以直接连接你的平面视图,并在一个组中捕获 url 部分。

由于 flatpages 应用程序要求该url部分同时具有前导斜杠和尾随斜杠 ( /foobar/),因此您必须使用装饰器调整flatpage视图函数,该装饰器将.html扩展名替换为/.

from functools import wraps
import re
from django.contrib.flatpages.views import flatpage

def replace_dot_html_with_slash(f):
    """Decorator that adapt the flatpage view to accept .html urls"""
    @wraps(f)
    def wrapper(request, url):
        # pretend the url has a trailing slash instead of `.html`
        return f(request, re.sub(r'\.html$', '/', url))
    return wrapper

adapted_flatpage = replace_dot_html_with_slash(flatpage)

urlpatterns = [
   ...
   re_path(r'^pages/(.*)$', adapted_flatpage)
]

或者,您可以简单地编写自己的平面视图。它没有做任何非常复杂的事情。

文档中有更多关于如何配置平面页面路由的示例。 https://docs.djangoproject.com/en/2.0/ref/contrib/flatpages/#using-the-urlconf


推荐阅读