1. se

    03.09.2008 15:44

    Добрый день, уважаемые гуру.
    Ситуация такая: необходимо организовать отображение информационных блоков на страницах. В базе предпологаю хранить инфу о блоке (параметры и вьюха) и идентификатор страницы.
    Как лучше организовать идентификацию страниц?
    Просто по url не очень подходит, т.к. есть необходимость группировки страниц.
    Лучшим вариантом для меня видится добавление параметра в схему url
    Например:
    url(r'^article/(?P<slug>\w+)$', 'articles.views.show_article', page_id="article")
    чтобы все статьи имели один идентификатор страницы.
    Со всеми тонкостями джанги еще не знаком. Подскажите пожайлуста куда копать. Нутром чую что надо идти в сторону middleware.
    Заранее благодарен.
  2. se

    03.09.2008 16:45

    Предпологаю это сделать следующим образом:
    Перед вызовом вьюхи переместить передаваемый ей пармаетром page_id в параметры request
    class PageIdMiddleware(object):
    def process_view(self, request, view, args, kwargs):
    request.__class__.page_identificator = kwargs.get('page_identificator', 'default')
    del kwargs['page_identificator'] # удаляем из параметров передаваемых в функцию
    return None
    В settings прописал данный класс в MIDDLEWARE_CLASSES.
    Но данный код не работает.
    Версия джанги самая свежая.
    Подскажите, что я делаю не так.
  3. se

    03.09.2008 17:02

    Разобрался сам.
    Окончательный код:

    пример urls.py
    url(r'^article/(?P<slug>\w+)$', 'articles.views.show_article', {'page_identificator': 'article')
    Middleware
    class PageIdMiddleware(object):
    """
    Обрабатывает входные параметры для вьюхи,
    если есть параметр _page_id, перемещает параметр в request
    """
    def process_view(self, request, view, args, kwargs):
    request.__class__.page_identificator = kwargs.get('page_identificator', 'default')
    if kwargs.has_key('page_identificator'): del kwargs['page_identificator']
    return None
    теперь у request есть параметр page_identificator который можно использовать для идентификации типа страницы.

    Может кто-нибудь предложит более красивое решение?
  4. def process_view(self, request, view, args, kwargs):
        request.page_identificator = kwargs.pop('page_identificator', 'default')
    
  5. Иван Сагалаев

    03.09.2008 19:06

    Кстати, request.__class__ не столько некрасиво, сколько неверно, потому что тогда идентификатор будет один на несколько произвольных запросов.

bbcode