Перенаправление urls.py с обращением URL и параметрами - есть ли более простой способ? - PullRequest
4 голосов
/ 15 июня 2011

Учитывая две категории сущностей, я выбираю какой-то их набор продуктов со следующим определением URL:

url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$", view, {}, name="cross")

, поэтому в основном URL-адреса, такие как /category1/1,2,3,4/category2/5,6,7,8/, действительны.

Теперь я ввел несколько представлений для одних и тех же данных, так что теперь у меня есть URL-адреса, такие как /category1/1,2,3,4/category2/5,6,7,8/view1/ и /category1/1,2,3,4/category2/5,6,7,8/view2/.Я хотел бы перенаправить «старые» URL-адреса на view1.Я не нашел ничего проще, чем это:

url(r"^category1/(?P<category1>([0123456789]+,?)+)/category2(?P<category2>([0123456789]+,?)+)/$",
    redirect_to, {
    'url': lazy(lambda: reverse(
        'cross_view1',
        kwargs={
            'category1': '111111',
            'category2': '222222',
        }
     ).replace('111111', '%(category1)s') \
      .replace('222222', '%(category2)s'), str)(),
     name="cross"}

Суть в том, что я хочу повторно использовать мои совпадающие группы в URL, однако я не могу предоставить их как kwargs для redirect_to, так как онине будет интерполироваться, и я также не могу поместить дословное форматирование в URL, так как он должен соответствовать моему регулярному выражению (числовые идентификаторы, разделенные запятыми).Поэтому я ввожу некоторые уникальные идентификаторы (в данном случае 111111 и 222222) и заменяю их впоследствии.

Очевидно, что это выглядит, выглядит, пахнет и имеет очень неприятный вкус.Есть ли какой-нибудь более чистый способ сделать это, кроме введения дополнительного представления и пропуска redirect_to в целом?

Ответы [ 2 ]

1 голос
/ 12 июня 2014

У вас есть несколько вариантов здесь.Вы можете использовать RedirectView, но мне не удалось заставить его отменить URL-адреса, так как похоже, что он запускается до загрузки urlpatterns.Вы можете использовать его следующим образом, настроить его для своего проекта:

from django.views.generic import RedirectView

Добавьте это к своим URL-адресам:

url(r'^(?P<location_id>\d+)/$', RedirectView.as_view(url='/statistics/dailyreport/%(location_id)s/')),

ИСПОЛЬЗУЙТЕ LAMBDA : Этодолжен работать в большинстве версий django, я использую его в 1.6.5:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)
0 голосов
/ 27 октября 2013

Просто быстрое замечание, что в вашем регулярном выражении вы можете использовать [0-9] вместо [0123456789]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...