[英]Django tag for relative urls
我想編寫一個自定義的url模板標簽,該標簽也可以使用相對路徑(不僅是命名模式),還可以接受參數中的列表(以后用於調用其他視圖函數-這就是為什么我需要請求對象)。 這是我在template中的標簽:
{% with '/views' (normally it's a var created in for loop) as link %}
<a href="{% url_for link params=('website','homepage') %}">Click</a>
{% endwith %}
和標簽的代碼本身:
@register.simple_tag(takes_context = True)
def url_for(context, parser, token):
request = context['request']
bits = token.split_contents()
if len(bits) < 2:
raise TemplateSyntaxError("'%s' takes at least one argument"
" (path to a view)" % bits[0])
try:
if "/" in bits[1]:
bits[1] = unicodedata.normalize('NFKD', bits[1]).encode('utf-8', 'ignore')
try:
bits[1] = resolve(bits[1].replace("'","")).url_name
except Exception as e:
log.error('Exception when resolving url for tag: %s' % e)
viewname = bits[1]
except Exception as exc:
raise
args = []
kwargs = {}
asvar = None
bits = bits[2:]
if len(bits):
for bit in bits:
if 'params' in bit:
par = ast.literal_eval(bit.split('=')[1])
my_function(request, par[0], par[1])
break
from django.core.urlresolvers import reverse, NoReverseMatch
url = ''
try:
url = reverse(viewname, args=args, kwargs=kwargs, current_app=context.current_app)
except NoReverseMatch:
exc_info = sys.exc_info()
if settings.SETTINGS_MODULE:
project_name = settings.SETTINGS_MODULE.split('.')[0]
try:
url = reverse(project_name + '.' + view_name,
args=args, kwargs=kwargs,
current_app=context.current_app)
except NoReverseMatch:
six.reraise(*exc_info)
else:
raise
return url
不幸的是,我現在唯一能實現的是TemplateSyntaxError at /: Could not parse the remainder: '('website','homepage')' from '('website','homepage')'
處的TemplateSyntaxError at /: Could not parse the remainder: '('website','homepage')' from '('website','homepage')'
。 在此之前,我試圖對原始的url標簽和URLNode進行猴子補丁,但那里存在很多其他問題。 任何解決這個問題的幫助。
模板文件不是Python。 因此,您不能使用參數執行元組操作。 而是重構模板標簽以采用這種類型的語法:
{% url_for link params='website homepage' %}
然后,在解析模板標記中的bits
變量時必須考慮到這一點。 最終歸結為解析字符串。
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-the-compilation-function
請參閱“ token.contents”和“ token.split_contents()”的注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.