0

我正在用 Django 创建一个博客网站。我有一个这样的博客模型:

class Blog(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255)
    ...

我希望每个博客的首页都位于这样的 URL:www.example.com/blog-slug/

但是,我也在使用 Flatpages,并且希望它能够匹配这样的 URL:www.example.com/flat-page/

所以像这样的 urlpatterns 是行不通的:

urlpatterns = patterns('',
    (r'^(?P<blog_slug>[-\w]+)/$', 'weblog_index', {}),
    ...
    (r'^', include('django.contrib.flatpages.urls')),
)

因为所有 Flatpages URL 都会被第一个模式捕获。我想我希望第一个模式匹配 Blog 模型中的有效 slug,但我不知道该怎么做。

4

2 回答 2

1

你不能这样做:

我想我希望第一个模式只匹配 Blog 模型中的有效 slug,但我不知道该怎么做。

既然是,Django 只会尝试与您的正则表达式匹配的第一个视图。如果该视图引发 404,它不会尝试任何其他 URL。

但是,您可以在不添加任何内容的情况下做您想做的事情urls.py

来自Django 文档

要安装 flatpages 应用程序,请执行以下步骤:

  1. 'django.contrib.sites'通过添加到您的设置来安装站点框架INSTALLED_APPS,如果它还没有在那里。

  2. 还要确保您已正确设置SITE_ID设置文件所代表的站点 ID。这通常是 1(即SITE_ID = 1,但如果您使用站点框架来管理多个站点,它可能是不同站点的 ID。

  3. 添加'django.contrib.flatpages'到您的INSTALLED_APPS设置中。

  4. 添加'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'到您的MIDDLEWARE_CLASSES设置中。

  5. 运行命令manage.py syncdb

基本上,只要您的博客应用程序Http404在遇到不存在博客条目的 slug 时提出一个问题,您就可以开始了。

放置'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'在您的MIDDLEWARE_CLASSES意思是,就在 Django 呈现错误页面之前,它会检查 aFlatPage与生成 404 的 URL 匹配的路径(即,如果有 404,它会回退到检查 a FlatPage)。如果有,它会渲染它。

于 2010-09-16T11:31:45.293 回答
1

正如 Dominic 所指出的,Flatpages 应用程序的全部意义在于它会自动匹配任何未被其他视图捕获的页面。

因此,即使您不能将weblog_index视图限制为仅有效的 slug,您也可以在该视图中执行一个简单的操作get_object_or_404,以便在找不到匹配的 Blog slug 时引发 404 错误 - 并且 Flatpages 应用程序会立即拦截 404 , 一切都如你所愿。

于 2010-09-16T11:58:43.867 回答