Mein Code in myapp_extras.py:
from django import template
register = template.Library()
@register.inclusion_tag('new/userinfo.html')
def address():
address = request.session['address']
return {'address':address}
in 'settings.py':
TEMPLATE_CONTEXT_PROCESSORS =(
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request'
)
aber ich habe einen Fehler bekommen:
TemplateSyntaxError at /items/
Caught an exception while rendering: global name 'request' is not defined
Original Traceback (most recent call last):
File "C:\Python25\lib\site-packages\django\template\debug.py", line 71, in render_node
result = node.render(context)
File "C:\Python25\lib\site-packages\django\template\__init__.py", line 915, in render
dict = func(*args)
File "C:\p4\projects\myproject\..\myproject\invoice\templatetags\myapp_extras.py", line 9, in address
address = request.session['address']
NameError: global name 'request' is not defined
Ich habe auf diese verwiesen. Ist es in Django möglich, über ein benutzerdefiniertes Tag auf die aktuelle Benutzersitzung zuzugreifen? .
Antworten:
request
ist keine Variable in diesem Bereich. Sie müssen es zuerst aus dem Kontext abrufen. Übergeben Sie estakes_context
an den Dekorateur und fügen Siecontext
es den Tag-Argumenten hinzu .So was:
@register.inclusion_tag('new/userinfo.html', takes_context=True) def address(context): request = context['request'] address = request.session['address'] return {'address':address}
quelle
django.template.context_processors.request
,TEMPLATES
in Ihren settings.py hinzuzufügen , sonst wird die Anfrage nicht in den Kontext aufgenommenIch habe eine Lösung von oben (von Ignacio Vazquez-Abrams) ausprobiert und es hat tatsächlich nicht funktioniert, bis ich herausgefunden habe, dass Kontextprozessoren nur mit der
RequestContext
Wrapper-Klasse funktionieren .In der Hauptansichtsmethode sollten Sie also die folgende Zeile hinzufügen:
from django.template import RequestContext return render_to_response('index.html', {'form': form, }, context_instance = RequestContext(request))
quelle
@register.simple_tag(takes_context = True)
und danndef my_tag(context, ...) ... return render_to_response('index.html', {'form': form, }, context_instance = context)
.Ich habe es so gemacht:
from django import template register = template.Library() def do_test_request(parser,token): try: tag_name = token.split_contents() # Not really useful except ValueError: raise template.TemplateSyntaxError("%r error" % token.contents.split()[0]) return RequestTestNode() class RequestTestNode(template.Node): def __init__(self,): self.request = template.Variable('request') def render(self, context): rqst = self.request.resolve(context) return "The URL is: %s" % rqst.get_full_path() register.tag('test_request', do_test_request)
Es gibt auch eine Funktion namens
resolve_variable
, die jedoch veraltet ist.Ich hoffe es hilft!
quelle