簡體   English   中英

相對URL的Django標簽

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM