django - 将“request”参数传递给自定义模板标记的正确方法是什么

时间:2011-09-24 20:10:30

标签: django django-views django-templates

我创建了一个自定义模板标记,我想在我网站的每个页面上使用它。我在自定义模板标记内部有一个功能 get_ip ,需要请求参数才能从用户那里获取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 个答案:

答案 0 :(得分:2)

你不应该在包含标签中实际渲染模板 - 装饰者会为你做这件事。您只需返回应该用于呈现您指定的模板的上下文。

答案 1 :(得分:1)

尝试这样的事情。

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

答案 2 :(得分:1)

您的包含标记应返回要呈现给模板的上下文,而不是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)