如何让Django urlpattern只接受模型中的slu ..

时间:2010-09-16 11:25:27

标签: django url-pattern

我正在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,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

你不能这样做:

  

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

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

但是,可以执行您尝试执行的操作而不向urls.py添加任何内容:

来自Django docs

  

要安装flatpages应用,请按以下步骤操作:

     
      
  1. 通过将'django.contrib.sites'添加到INSTALLED_APPS设置来安装网站框架(如果它尚未存在)。

  2.   
  3. 还要确保您已将SITE_ID正确设置为设置文件所代表的网站的ID。这通常为1(即SITE_ID = 1,但如果您使用网站框架管理多个网站,则可能是其他网站的ID。

  4.   
  5. 'django.contrib.flatpages'添加到您的INSTALLED_APPS设置。

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

  8.   
  9. 运行命令manage.py syncdb

  10.   

基本上,只要您的博客应用在遇到没有博客条目的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,并且所有内容都按照您的意愿运行。