Найти - Пользователи
Полная версия: Получить урл в templatetags
Начало » Django » Получить урл в templatetags
1
to_night
Есть view, которое получает из урл http://www.example.com/2014/05/03/ дату:
И генерирует ссылку current_date на запрошенный url и генерирует ссылку
tomorrow_date на завтрашний день. Также есть некоторая логика, которую
обрабатывает из даты урл:

 
def to_date(request, year, month, day):
    day = int(day)
    month = int(month)
    year = int(year)
    
    current_date = '{year}{month}{day}'.format(year=year,
                                               month=date.month,
                                               day=date.day)
    
    next_date = datetime(year, month, day) + timedelta(days=1)
    tomorrow_date = '{year}{month}{day}'.format(year=next_date.year,
                                                month=next_date.month,
                                                day=next_date.day)
    # Any logic:
    # ...do_something
    template = loader.get_template('content.html')
    context = RequestContext(request, {
        'current_date': current_date,
        'tomorrow_date': tomorrow_date,
        #'do_something': do_something,
    })
    return HttpResponse(template.render(context))


Задача: Нужно ссылки убрать в отдельное menu, чтобы, подключать menu.html и отделить
ссылки от content.html. Пробовал через temlatetags, но непонятно как получить
данные из урл e.g. to_date(request, year, month, day), чтобы сгенерировать ссылки.
Singularity
to_night
{% url "view_name" 1 object.3 "fff"%}
to_night
Singularity
to_night
{% url “view_name” 1 object.3 “fff”%}

Спасибо, но непонятно. Можно чуть подробнее?

FishHook
Давайте разобьём задачу на простые и понятные этапы. Даты, завтра - послезавтра, конкретные моменты, относящиеся к Вашей текущей программе не интересны. Итак, поэтапно, что не получается на первом шаге?
to_night
Функция генерирует некоторые данные и меню исходя из урл (случайном). И отдает шаблон content.html, содержащий menu и content. Хочу разделить на две функции get_content get_menu. Проблема: как их разделить, если данные они получают с одного url, а отдают в разные шаблоны?
FishHook
Итак, вопрос “Нужно логику разделить на две функции”
Ответ:
def f1(request):
    return response
def f2(request):
    return response
def common(request):
    if condition:
       return f1(request)
    return f2(request)
to_night
Вопрос 2. Как на один url отдавать две функции сразу? Спасибо.
FishHook
to_night
Вопрос 2. Как на один url отдавать две функции сразу? Спасибо.
Клиент (html-страница во вкладке браузера) ожидает одного ответа на один запрос, после которого, он (в классическом варианте) обновляет содержимое страницы содержимым ответа. Как Вы представляете себе работу веб-приложения, которое на один реквест возвращает несколько респонзов?
maxfox
Если я правильно понял вашу задачу, то вы хотите:
1. В шапке выводить ссылки с датой сегодня/завтра.
2. В теле страницы выводить некий контент.
3. Вынести шапку в отдельный шаблон.

Тогда вы можете:
1. Передать дату в контексте шаблона и использовать тег %url. Читайте документацию: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#url Там есть примеры. Вам все равно придется использовать одну view функцию, если вы хотите, она может вызывать другую, но шаблонизатор будет вызывать только одна из них, а вызываемый шаблон будет вызывать другие, подключаемые шаблоны и шаблонные теги. Передать в них напрямую ничего не получится, если вы об этом.
2. Сделать это через JS, как вариант.
to_night
Вынес меню в отдельный template tag, беру данные из request, вставляю {% days_menu %} в любом месте, теперь оно не связанно с view.
@register.inclusion_tag('menu.html', takes_context=True)
def days_menu(context):
    request = context['request']
    date_list = request.path.split('/')
    day = int(date_list[3])
    month = int(date_list[2])
    year = int(date_list[1])
    previews_date = datetime(year, month, day) - timedelta(days=1)
    previews_day = '%02d' % previews_date.day
    previews_month = '%02d' % previews_date.month
    yesterday_link = '/{year}/{month}/{day}/'.format(year=previews_date.year,
                                                     month=previews_month,
                                                     day=previews_day)
    next_date = datetime(year, month, day) + timedelta(days=1)
    next_day = '%02d' % next_date.day
    next_month = '%02d' % next_date.month
    tomorrow_link = '/{year}/{month}/{day}/'.format(year=next_date.year,
                                                    month=next_month,
                                                    day=next_day)
    now_day = datetime.today().day
    now_month = datetime.today().month
    now_year = datetime.today().year
    now_day = '%02d' % now_day
    now_month = '%02d' % now_month
    today_link = '/{year}/{month}/{day}/'.format(day=now_day,
                                                 month=now_month,
                                                 year=now_year)
    return {'tomorrow_link': tomorrow_link,
            'today_link': today_link,
            'yesterday_link': yesterday_link}
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