Django url.py 同一正则名模式下的不同视图函数

2 投票
1 回答
1203 浏览
提问于 2025-04-15 19:56

我正在过滤几个类别(cat1、cat2、cat3),让它们通过不同的视图来显示,而其他的类别则通过其他的视图函数来处理。每次添加一个新的类别时,我都需要在网址模式(urlpatterns)中不断添加新的类别标识,这样做变得越来越麻烦。我想知道有没有办法把这部分从正则表达式中提取出来?

urlpatterns = patterns('catalog.category_views',
    (r'^(?P<cat_slug>(cat1|cat2|cat3))/$', 'universal_category'),
    (r'^(?P<cat_slug>(cat1|cat2|cat3))/(?P<subcat_slug>[-\w]+)/$', 'subcat_listing'),
    (r'^(?P<cat_slug>(cat1|cat2|cat3))/part/(?P<part>[-\w]+)/$', 'subcat_product'),
)

urlpatterns += patterns('catalog.make_views',
    (r'^(?P<cat_slug>[-\w]+)/$', 'category'),
    (r'^(?P<cat_slug>[-\w]+)/(?P<make_slug>[-\w]+)/$', 'make'),
    (r'^(?P<cat_slug>[-\w]+)/(?P<make_slug>[-\w]+)/(?P<model_slug>[-\w]+)/(?P<year_low>\d{4})-(?P<year_high>\d{4})/$', 'listing'),
    (r'^(?P<cat_slug>[-\w]+)/part/(?P<part>[-\w]+)/$', 'product'),
)

1 个回答

4

我个人觉得把这个逻辑放在视图里比放在网址模式里更好。

我会先创建一个包含所有特殊类别的列表,比如:

special_cats = ['cat1','cat2','cat3']

然后在你的视图中,你可以这样做:

def generic_cat_view(request, cat_slug):
    if cat_slug in special_cats:
        return special_view(request, cat_slug)
    else:
        #generic view

这样,当你添加一个新的特殊类别时,只需要把它加到那个列表里就行了。

撰写回答