С какой стати я должен пройти RequestContext во всех моих ответов?

голоса
5

Я хочу , чтобы выделить текущую страницу в меню навигации. Очевидно , мне нужно дать ссылки меню класса как «активный» , когда вы на своей странице. Это классическая проблема и я видел много решений , предложенных . Моя проблема в том , я ненавижу их всех и не рассматривать ни один из них очень DRY. Например:

@register.simple_tag
def active(request, pattern):
    import re
    if re.search(pattern, request.path):
        return 'active'
    return ''

----

{% load tags %}
<div id=navigation>
    <a class={% active request ^/about/ %} href=/about/>About</a>
    <a class={% active request ^/contact/ %} href=/contact/>Contact</a>
    <a class={% active request ^/services/ %} href=/services/>Services</a>
</div>

Тег принимает ваш текущий запрос и выражение URL-адрес и возвращает «активный», если вы в настоящее время на этой странице. Кроме того, это может быть сделано с именованными видами, а не URLs, но принцип тот же.

Моя главная проблема с этим состоит в том, что моя навигация будет называться на 99% мои взгляды и тем не менее, для того, чтобы получить текущий переменный запрос я до сих пор разобрать RequestContext на шаблон с чем-то вроде этого:

def contact(request):
    # snip ...
    return render_to_response(
                'contact.html',
                { 'myvar' : myvar },
                context_instance=RequestContext(request))

Почему мне нужно добавить эту context_instance линии к каждому из моих взглядов , когда возможно все , но один из них нуждается в переменном запросе для получения текущего URL / вида , чтобы выделить активную ссылку? Это , кажется , очень влажный, особенно для функции , которая должна быть в большинстве Джанго сайтов. Я хочу , чтобы этот запрос был включен по умолчанию , и иметь возможность дополнительно подавлять его. Я не могу найти способ сделать это в качестве промежуточного слоя я не могу перехватить шаблон до его визуализации после того , как вид вернул его.

Какие-либо предложения?

Задан 27/06/2009 в 08:37
источник пользователем
На других языках...                            


3 ответов

голоса
16

Ваше намерение имеет смысл, вам нужно RequestContextбольшая часть времени и лишь в редких случаях он может быть безопасно опущен из соображений производительности. Решение простое, вместо render_to_responseиспользования direct_to_templateярлыка:

from django.views.generic.simple import direct_to_template

def contact(request):
    # snip ...
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar })

... или render_toдекоратор из Джанго-раздражающее :

from annoying.decorators import render_to

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}     
Ответил 27/06/2009 в 15:23
источник пользователем

голоса
1

Вы не обязательно должны делать что-либо для разметки вашей навигации, чтобы дать текущей другой стиль - есть декларативные способы сделать это с помощью CSS.

Смотрите мой ответ здесь: Django: Есть ли лучший способ смелой текущей страницы ссылки для примера.

Ответил 27/06/2009 в 08:42
источник пользователем

голоса
0

Для дальнейшего использования, можно использовать Джанго язычки за то , что хотел ОП.

Ответил 10/02/2011 в 13:42
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more