我的网站针对不同的类别使用不同的网址,这会根据类别返回过滤的查询集,例如/sport/
将返回Post.objects.filter(category='sport')
网址
urlpatterns = [
url(r'^news/$', boxes_view, name='news'),
url(r'^sport/$', boxes_view, name='sport'),
url(r'^technology/$', boxes_view, name='technology'),
url(r'^science/$', boxes_view, name='science'),
url(r'^cars/$', boxes_view, name='cars'),
url(r'^television/$', boxes_view, name='television'),
url(r'^(?P<category>\w+)/(?P<id>\d+)/', article, name='article'),
视图
def boxes_view(request):
category = 'news'
for a, b in CATEGORY_CHOICES:
name = resolve(request.path_info).url_name
if b == name:
category = a
posts = Post.objects.all().filter(category=category)
choices.py
CATEGORY_CHOICES = (
('1', 'news'),
('2', 'sport'),
('3', 'technology'),
('4', 'science'),
('5', 'cars'),
('6', 'television')
)
除了列出我的网址中的每个类别,我还能写出一个统一的网址格式来代表所有这些吗?
答案 0 :(得分:1)
是。事实上,你看起来像是在那里。您可以使用正则表达式识别类别名称,并将其传递给视图,就像使用列表中的最后一个网址一样(&#39;文章&#39;)。
尝试这样的事情:
urlpatterns = [
url(r'^(?P<category>\w+)/$', boxes_view, name='category'), #or whatever name
url(r'^(?P<category>\w+)/(?P<id>\d+)/', article, name='article'),
]
然后您的观点将是:
def boxes_view(request, category='news'):
try:
category_number = CATEGORY_MAP[category]
except KeyError:
# return 404?
posts = Post.objects.filter(category=category_number)
...
然后你需要一个类别地图,就像你的元组一样,但是我会使用像这样的字典:
CATEGORY_MAP = {
'news': 1,
...
}
虽然我需要查看更多您的架构,但从我看到的情况来看,我建议类别应该是他们自己的模型,然后您可以在category__name
中执行Post
过滤并删除从名称到数字的映射。