如何在Django中使用一个应用满足多个URL

4 投票
2 回答
2839 浏览
提问于 2025-04-15 18:12

我想用一个应用程序来处理多个网址路径。也就是说,我希望网址 /blog//job/ 都能用同一个应用,但显示不同的内容。目前我知道有很多方法可以做到这一点,但似乎没有哪个方法特别简单。现在我正在做的是:

# /urls.py
urlpatterns = patterns("",
    (r"^(blog|job)/", include("myproject.myapp.urls")),
)

# /myapp/urls.py
urlpatterns = patterns("myproject.myapp.views",
    (r"^(?P<id>\d+)/edit/$",    "myproject.myapp.views.edit"),
    (r"^(?P<id>\d+)/delete/$",  "myproject.myapp.views.delete"),
    (r"^(?P<id>\d+)/update/$",  "myproject.myapp.views.update"),
    (r"^insert/$",              "myproject.myapp.views.insert"),
)

urlpatterns += patterns("",
    (r"^(?P<object_id>\d+)/$",  "django.views.generic.list_detail.object_detail", info_dict, "NOIDEA-detail"),
    (r"^/$",                    "django.views.generic.list_detail.object_list",   info_dict, "NOIDEA-community"),
)

# /myapp/views.py
def edit(request, type, id):
    if (type == "blog"):
        editBlog(request, id)
    else (type == "job")
        editJob(request, id)

def editBlog(request, id):
    # some code

def editJob(request, id):
    # some code

为了让代码更整洁,我把这些内容拆分成了多个模型和视图文件,但上面的例子没有考虑到像反向网址查找这样的情况,这导致我所有的模板 {% url %} 调用都出问题了。

最开始,我把博客、工作、活动、比赛等都放在各自的应用里,但它们的功能太相似了,所以我觉得这样不太合理,于是我尝试把它们合并在一起……结果就出现了这种情况。你看到我那些通用视图里的 "NOIDEA-detail" 和 "NOIDEA-community" 网址名称了吗?对,我也不知道该用什么 :-(

2 个回答

0

我觉得这个看起来不错。如果你想要反向查找的话,可以给每种网址格式设置一个不同的反向名称,即使它们最终指向的是同一个视图。

4

你可以有多个模块来定义网址。比如,你可以在 myapp/urls.py 里定义 /blog/ 的网址,而在 myapp/job_urls.py 里定义 /job/ 的网址。或者你也可以在一个叫 urls 的子包里放两个模块。

另外,你也可以手动给你的网址定义加上前缀:

urlpatterns = patterns("myproject.myapp.views",
    (r"^jobs/(?P<id>\d+)/edit/$",    "myproject.myapp.views.edit"),
    (r"^jobs/(?P<id>\d+)/delete/$",  "myproject.myapp.views.delete"),
    (r"^jobs/(?P<id>\d+)/update/$",  "myproject.myapp.views.update"),
    (r"^jobs/insert/$",              "myproject.myapp.views.insert"),
)

urlpatterns += patterns("",
    (r"^blog/(?P<object_id>\d+)/$",  "django.views.generic.list_detail.object_detail", info_dict, "NOIDEA-detail"),
    (r"^blog/$",                    "django.views.generic.list_detail.object_list",   info_dict, "NOIDEA-community"),
)

然后可以这样挂载它们:

urlpatterns = patterns("",
    (r"", include("myapp.urls")),
)

不过我个人更倾向于使用更符合REST风格的网址定义,比如 blog/(?P<post_id>\d+)/edit/$

撰写回答