У меня довольно стандартное приложение django, и мне интересно, как настроить маршрутизацию URL-адресов, чтобы мне не приходилось явно сопоставлять каждый URL-адрес с представлением.
Например, предположим, что у меня следующие представления: Project, Links, Profile, Contact. Я бы предпочел, чтобы мой urlpatterns не выглядел так:
(r'^Project/$', 'mysite.app.views.project'),
(r'^Links/$', 'mysite.app.views.links'),
(r'^Profile/$', 'mysite.app.views.profile'),
(r'^Contact/$', 'mysite.app.views.contact'),
И так далее. В Пилоны это было бы очень просто:
map.connect(':controller/:action/:id')
И он автоматически захватит нужный контроллер и функцию. Есть ли что-то подобное в Django?
Да, ошибки копирования / вставки - это довольно мило.






mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Это дает мне ошибку 'generator' object has no 'resolve'. Думаю, я знаю, что вы пытаетесь сделать (написать маршрут для каждой строки в кортеже), но вместо этого он создает генератор, который django не может разрешить.
я не тестировал, попробуйте развернуть генератор с помощью * (... for ...). я редактирую ответ
У меня сейчас синтаксическая ошибка. Я никогда не видел, чтобы * использовалось таким образом ... это должно разыменовывать указатель, такой как C? Не могли бы вы проверить это перед публикацией?
он расширяет итератор до позиционных аргументов. я уже тестировал это.
Вы используете какую-то библиотеку? Какая версия питона? Я получаю синтаксическую ошибку для каждого типа объекта-итератора, на котором я это пробую.
нет библиотеки, python2.5, но я не думаю, что это новая функция. попробуйте в командной строке: def f (a, b, c): напечатайте a, b, c f (1, * (2,3))
Получил, чтобы работать. У меня был лишний ',' там, оставшийся от определения по умолчанию после оператора, который вызывал синтаксические ошибки. Следует отметить, что трюк * () работает только как аргумент. foo = *(1,2) вызывает синтаксическую ошибку. Я подозреваю, что это связано с разыменованием указателя.
дело не в указателях, '* (1,2)' расширяет кортеж (одно составное значение) до двух чисел, и вы не можете присвоить два числа переменной simgle.
Это совершенно нечитабельно, по крайней мере, для меня. Я бы гораздо больше хотел просто взглянуть на код и увидеть его, а затем потратить секунду или проанализировать его. Может я просто такой устроен :)
@ {kender, hop}: да, я бы тоже не хотел это видеть, да и сам бы не стал. но свиллиамс хотел, так что он есть! :-)
Эх, мне просто очень нравится, как Pylons выполняет маршрутизацию. На мой взгляд, Web.py делает это даже лучше, хотя Django выигрывает во всем остальном.
Если у вас нет действительно огромный количества просмотров, записать их явно не так уж плохо с точки зрения стиля.
Однако вы можете сократить свой пример, используя аргумент префикса функции patterns:
urlpatterns = patterns('mysite.app.views',
(r'^Project/$', 'project'),
(r'^Links/$', 'links'),
(r'^Profile/$', 'profile'),
(r'^Contact/$', 'contact'),
)
Это правда, но теперь я чувствую себя обязанным. :)
Возможно, вы сможете использовать специальную функцию просмотра в следующих строках:
def router(request, function, module):
m =__import__(module, globals(), locals(), [function.lower()])
try:
return m.__dict__[function.lower()](request)
except KeyError:
raise Http404()
а затем urlconf, подобный этому:
(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}),
Этот код не тестировался, но общая идея должна работать, даже если вы должны помнить:
Явное лучше, чем неявное.
Подождите, вы хотите, чтобы '^ Links / $' указывал на mysite.app.views.links?