Найти - Пользователи
Полная версия: Упрощение url и middleware для view
Начало » Django » Упрощение url и middleware для view
1
nuklea
Имеется:

urls.py
urlpatterns = patterns('',
url(r'^order/', include('order.urls')),
)
order/urls.py
urlpatterns = patterns('',
url(r'^new', views.new, name='new'),
url(r'^auth$', views.auth, name='auth'),
url(r'^(\d+)/recipient', views.recipient, name='recipient'),
url(r'^(\d+)/select', views.friend_select, name='select'),
url(r'^(\d+)/photos', views.photos, name='photos'),
url(r'^(\d+)/poster(\d+)', views.poster, name='poster'),
url(r'^(\d+)/posters', views.order, name='posters'),
url(r'^poster(\d+)/remove', views.remove_poster, name='remove_poster'),
url(r'^(\d+)/contacts', views.contacts, name='contacts'),
url(r'^(\d+)/payment', views.payment, name='payment'),
url(r'^(\d+)/delivery', views.delivery, name='delivery'),
)
Тут в каждой вьюхе происходит одно тоже, получается объект Order, проверяется, принадлежит ли он определенному пользователю.

Задача: превратить весь этот кошмар в примерно следующее:

urls.py
urlpatterns = patterns('',
url(r'^order/new', order.views.new),
url(r'^order(?P<order_id>\d+)/', include('order.urls')),
)
order/urls.py
urlpatterns = patterns('',
url(r'^auth$', views.auth, name='auth'),
url(r'^recipient', views.recipient, name='recipient'),
url(r'^select', views.friend_select, name='select'),
url(r'^photos', views.photos, name='photos'),
url(r'^poster(\d+)', views.poster, name='poster'),
url(r'^posters', views.order, name='posters'),
url(r'^poster(\d+)/remove', views.remove_poster, name='remove_poster'),
url(r'^contacts', views.contacts, name='contacts'),
url(r'^payment', views.payment, name='payment'),
url(r'^delivery', views.delivery, name='delivery'),
)
А так же добавить в request инстанс модели Order. Получается эдакий middleware для вьюхи. Но вот проблема, не знаю, с какой стороны к этому всему подступиться.
appetito
что значит
nuklea
добавить во все шаблоны, обрабатываемые как orderNumber/someaction инстанс объекта Order
?
что будет делать объект в шаблоне URL?
nuklea
appetito
что значит
nuklea
добавить во все шаблоны, обрабатываемые как orderNumber/someaction инстанс объекта Order
?
что будет делать объект в шаблоне URL?
Переформулировал топик. Я имел ввиду, что нужно добавит в request инстанс модели Order.
appetito
можно сделать декоратор типа
def decorator(fn):
def _wrapper(request, order_id):
request.order = Order.objects.get(pk=order_id)
return fn(request, ordr_id)
return _wrapper
и применять его к нужным функциям вида
nuklea
Спасибо за возможное решение. Еще мысли есть? :)
Doberman26rus
ну сделай мидлевару, где будешь парсить урл, а дальше как в декораторе приведенном выше. А для чего тебе это нужно?
nuklea
Чтобы уменьшить количество повторяющегося кода.
fth
А почему бы вам просто написать функцию принимающую request, order_id и отдающую order, ну и выбрасывающую 403-й эксепшн когда надо?
По одной повторяющейся строчке в каждой вьюхе ничего страшного.

Решение получше и правильнее декоратора и уж тем более мидлвари.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB