Учитывая две категории сущностей, я выбираю какой-то их набор продуктов со следующим определением 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
в целом?