2010-01-19 1 views
4

Я пытаюсь использовать одно приложение для удовлетворения нескольких URL-адресов. То есть, я хочу, чтобы URL /blog/ и /job/ использовали одно и то же приложение, но разные виды. Есть несколько способов сделать это, я уверен, но ни один из них не кажется очень чистым. Вот что я делаю прямо сейчасКак использовать одно приложение для удовлетворения нескольких URL-адресов в Django

# /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» на моих общих представлениях? Да, я не знаю, что использовать там :-(

ответ

4

вы можете иметь более одного модуль определение URL-адреса. вы можете /blog/ URL-адрес в myapp/urls.py и /job/ URL-адрес в myapp/job_urls.py. Или вы можете иметь два модуля в urls подпакете.

в качестве альтернативы вы можете префикс вручную ваши определения url:

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/$.

0

Выглядит неплохо для меня. Если вы хотите обратный поиск, просто укажите другое обратное имя для каждого формата URL-адреса, даже если они в конечном итоге указывают на то же самое вид.