如何在Django中使用一个应用满足多个URL
我想用一个应用程序来处理多个网址路径。也就是说,我希望网址 /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/$
。