如何使用一个应用程序来满足Django中的多个URL

时间:2010-01-19 16:17:07

标签: python django django-urls

我正在尝试使用一个应用来满足多个网址路径。也就是说,我希望网址/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查找这样会破坏我的所有模板{% url %}调用的内容。

最初,我的博客,工作,活动,竞赛等都存在于他们自己的应用程序中,但是他们的所有功能都非常相似,因此保留这种方式是没有意义的,所以我试图结合起来他们......发生了这件事。您在我的通用视图中看到了那些“NOIDEA-detail”和“NOIDEA-community”网址名称?是的,我不知道在那里使用什么: - (

2 个答案:

答案 0 :(得分:4)

您可以拥有多个定义网址的模块。您可以在/blog/中的myapp/urls.py/job/网址中拥有myapp/job_urls.py个网址。或者,您可以在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")),
)

我个人会考虑更多RESTful URL定义。例如blog/(?P<post_id>\d+)/edit/$

答案 1 :(得分:0)

对我来说很好看。如果你想要反向查找,每个url格式只有一个不同的反向名称,即使它们最终指向同一个视图。