django - как правильно передать параметр «request» в пользовательский тег шаблона - PullRequest
0 голосов
/ 25 сентября 2011

Я создал собственный шаблонный тег, который хочу использовать на каждой странице моего веб-сайта. У меня есть функция get_ip внутри пользовательского тега шаблона, которому нужен параметр request для получения IP-адреса от пользователя. Смотрите ниже:

MyApp / templatetags / header_tags.py


from django import template
register = template.Library()
...
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

@register.inclusion_tag('template.html', takes_context = True)
def user_ip(context):
    request = context['request']
    ip = get_ip(request)      
    return render_to_response('template.html',locals(), context_instance=RequestContext(request))

template.html


   {{ ip }}

my_main_template.html


{% load header_tags %}
{% user_ip %} 

Почему-то мой ip не сеет по моему основному шаблону. Моя функция get_ip работает, если использовать шаблон на странице views.py обычным способом, но по какой-то причине не показывает, когда используется из пользовательского тега шаблона выше. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2011

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

1 голос
/ 25 сентября 2011

Ваш тег включения должен возвращать контекст, который будет отображаться в шаблоне, а не render_to_response.Может выглядеть так:

def user_ip(context):
    my_context = {}
    request = context['request']
    my_context['ip'] = get_ip(request)      
    return my_context

register.inclusion_tag('template.html', takes_context = True)(user_ip)
1 голос
/ 25 сентября 2011

Попробуй потаскать вот так.

@register.inclusion_tag('template.html', takes_context = True)
def user_ip(context):
    return {'ip': get_ip(context['request'])}
...