我正在Django制作一个博客网站。我有一个像这样的博客模型:
class Blog(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255)
...
我希望每个博客的首页都是这样的网址:www.example.com/blog-slug /
但是,我也在使用Flatpages,并希望能够匹配这样的网址:www.example.com/flat-page /
所以这样的urlpatterns不起作用:
urlpatterns = patterns('',
(r'^(?P<blog_slug>[-\w]+)/$', 'weblog_index', {}),
...
(r'^', include('django.contrib.flatpages.urls')),
)
因为所有Flatpages网址都会被第一个模式捕获。我想我希望第一个模式只匹配来自Blog模型的有效slug,但我不知道该怎么做。
答案 0 :(得分:1)
你不能这样做:
我想我希望第一个模式只匹配Blog模型中的有效slug,但我不知道该怎么做。
既然是,Django只会尝试匹配正则表达式的第一个视图。如果该视图引发404,则不会尝试任何其他URL。
但是,可以执行您尝试执行的操作而不向urls.py
添加任何内容:
来自Django docs:
要安装flatpages应用,请按以下步骤操作:
通过将
'django.contrib.sites'
添加到INSTALLED_APPS
设置来安装网站框架(如果它尚未存在)。还要确保您已将
SITE_ID
正确设置为设置文件所代表的网站的ID。这通常为1(即SITE_ID = 1
,但如果您使用网站框架管理多个网站,则可能是其他网站的ID。将
'django.contrib.flatpages'
添加到您的INSTALLED_APPS
设置。将
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
添加到您的MIDDLEWARE_CLASSES
设置。- 醇>
运行命令
manage.py syncdb
。
基本上,只要您的博客应用在遇到没有博客条目的slug时引发Http404
,您就应该好了。
在'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
中放置MIDDLEWARE_CLASSES
表示在Django呈现错误页面之前,它会检查FlatPage
,其路径与生成404的URL匹配(即,如果有的话) 404,它回退到检查FlatPage
)。如果有,则呈现它。
答案 1 :(得分:1)
正如Dominic指出的那样,Flatpages应用程序的重点是它会自动匹配任何未被其他视图捕获的页面。
因此,即使您无法将weblog_index
视图仅限制为有效的slug,您也可以在该视图中执行简单的get_object_or_404
,这样就可以提升找不到匹配的Blog slug时出现404错误 - 并且Flatpages应用程序会立即拦截404,并且所有内容都按照您的意愿运行。