试图整理我的网址

时间:2017-03-09 02:48:52

标签: python django django-urls

我的网站针对不同的类别使用不同的网址,这会根据类别返回过滤的查询集,例如/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')
)

除了列出我的网址中的每个类别,我还能写出一个统一的网址格式来代表所有这些吗?

1 个答案:

答案 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过滤并删除从名称到数字的映射。