मुझे इस परियोजना के लिए ऐसा कुछ करना पड़ा और चूंकि हमें इस तरह के एक से अधिक शामिल टैग की आवश्यकता थी क्योंकि मैंने django inclusion_tag सजावट के आधार पर एक सजावटी बनाया था। यह कोड है:
# -*- coding: utf-8 -*-
from django import template
from inspect import getargspec
from django.template.context import Context
from django.template import Node, generic_tag_compiler, Variable
from django.utils.functional import curry
def inclusion_tag(register, context_class=Context, takes_context=False):
def dec(func):
params, xx, xxx, defaults = getargspec(func)
if takes_context:
if params[0] == 'context':
params = params[1:]
else:
raise TemplateSyntaxError("Any tag function decorated with takes_context=True must have a first argument of 'context'")
class InclusionNode(Node):
def __init__(self, vars_to_resolve):
self.vars_to_resolve = map(Variable, vars_to_resolve)
def render(self, context):
resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
if takes_context:
args = [context] + resolved_vars
else:
args = resolved_vars
file_name, extra_context = func(*args)
from django.template.loader import get_template, select_template
if not isinstance(file_name, basestring) and is_iterable(file_name):
t = select_template(file_name)
else:
t = get_template(file_name)
self.nodelist = t.nodelist
new_context = context_class(extra_context, autoescape=context.autoescape)
# Copy across the CSRF token, if present, because inclusion
# tags are often used for forms, and we need instructions
# for using CSRF protection to be as simple as possible.
csrf_token = context.get('csrf_token', None)
if csrf_token is not None:
new_context['csrf_token'] = csrf_token
return self.nodelist.render(new_context)
compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode)
compile_func.__doc__ = func.__doc__
register.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
return func
return dec
आपको टेम्पलेट (या टेम्पलेट सूची) और संदर्भ निर्देश के साथ एक टुपल वापस करना होगा। ध्यान दें कि आप रजिस्टर (लाइब्रेरी उदाहरण) डेकोरेटर कॉल में पारित करने के लिए है:
from somewhere import inclusion_tag
@inclusion_tag(register)
def display_formset(formset):
template_name = FORMSET_TEMPLATES.get(formset.model,
'includes/inline_formset.html')
return (template_name, {'formset': formset})
आशा इस मदद करता है
आप '{% my_template%} को शामिल करने के लिए क्या कर रहे हैं 'नहीं कर सकते हैं? –
मुझे कस्टम टैग के साथ संदर्भ में कुछ चर जोड़ने की जरूरत है। ऐसा लगता है कि मुझे टैग को लंबा रास्ता लिखना होगा। धन्यवाद। – meppum