Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2014 13:23:54

to_night
От: Киев
Зарегистрирован: 2013-12-12
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Есть 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), чтобы сгенерировать ссылки.

Офлайн

#2 Май 3, 2014 13:35:21

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Получить урл в templatetags

to_night

{% url "view_name" 1 object.3 "fff"%}

Офлайн

#3 Май 4, 2014 09:21:10

to_night
От: Киев
Зарегистрирован: 2013-12-12
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Singularity
to_night
{% url “view_name” 1 object.3 “fff”%}

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

Офлайн

#4 Май 4, 2014 09:36:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Давайте разобьём задачу на простые и понятные этапы. Даты, завтра - послезавтра, конкретные моменты, относящиеся к Вашей текущей программе не интересны. Итак, поэтапно, что не получается на первом шаге?



Офлайн

#5 Май 4, 2014 10:38:35

to_night
От: Киев
Зарегистрирован: 2013-12-12
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Функция генерирует некоторые данные и меню исходя из урл (случайном). И отдает шаблон content.html, содержащий menu и content. Хочу разделить на две функции get_content get_menu. Проблема: как их разделить, если данные они получают с одного url, а отдают в разные шаблоны?

Офлайн

#6 Май 4, 2014 10:49:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Итак, вопрос “Нужно логику разделить на две функции”
Ответ:

def f1(request):
    return response
def f2(request):
    return response
def common(request):
    if condition:
       return f1(request)
    return f2(request)



Офлайн

#7 Май 4, 2014 12:47:20

to_night
От: Киев
Зарегистрирован: 2013-12-12
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Вопрос 2. Как на один url отдавать две функции сразу? Спасибо.

Офлайн

#8 Май 4, 2014 12:58:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Получить урл в templatetags

to_night
Вопрос 2. Как на один url отдавать две функции сразу? Спасибо.
Клиент (html-страница во вкладке браузера) ожидает одного ответа на один запрос, после которого, он (в классическом варианте) обновляет содержимое страницы содержимым ответа. Как Вы представляете себе работу веб-приложения, которое на один реквест возвращает несколько респонзов?



Офлайн

#9 Май 4, 2014 18:24:38

maxfox
Зарегистрирован: 2013-07-27
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Если я правильно понял вашу задачу, то вы хотите:
1. В шапке выводить ссылки с датой сегодня/завтра.
2. В теле страницы выводить некий контент.
3. Вынести шапку в отдельный шаблон.

Тогда вы можете:
1. Передать дату в контексте шаблона и использовать тег %url. Читайте документацию: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#url Там есть примеры. Вам все равно придется использовать одну view функцию, если вы хотите, она может вызывать другую, но шаблонизатор будет вызывать только одна из них, а вызываемый шаблон будет вызывать другие, подключаемые шаблоны и шаблонные теги. Передать в них напрямую ничего не получится, если вы об этом.
2. Сделать это через JS, как вариант.

Офлайн

#10 Май 4, 2014 18:58:34

to_night
От: Киев
Зарегистрирован: 2013-12-12
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Получить урл в templatetags

Вынес меню в отдельный 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}

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version