Как использовать одно приложение для удовлетворения нескольких URL-адресов в Django - PullRequest
4 голосов
/ 19 января 2010

Я пытаюсь использовать одно приложение, чтобы удовлетворить несколько путей URL. То есть я хочу, чтобы 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, который прерывает все мои {% url %} вызовы шаблона.

Изначально у меня были блоги, рабочие места, события, конкурсы и т. Д., Все они жили в своих собственных приложениях, но все их функции были настолько похожи, что не было смысла оставлять это таким образом, поэтому я попытался объединить их ... и это случилось. Вы видите эти URL-адреса "NOIDEA-detail" и "NOIDEA-community" на моих общих взглядах? Да, я не знаю, что там использовать: - (

Ответы [ 2 ]

4 голосов
/ 19 января 2010

Вы можете иметь более одного модуля, определяющего 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 голосов
/ 19 января 2010

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

...