我创建了一个自定义模板标记,我想在我网站的每个页面上使用它。我在自定义模板标记内部有一个功能 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页面上以常规方式使用模板,但由于某些原因未显示何时从上面的自定义模板标记中使用,则该函数可用。有什么想法吗?
答案 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)