繁体   English   中英

有没有在Django中创建URL模板的通用方法?

[英]Is there a generic way to create an URL template in Django?

我正在寻找一种使用JavaScript在前端组成URL的简便方法。 让我们以Django教程中的URL模式为例:

urlpatterns = [
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

我想根据URL名称引用创建模板(在示例中使用的是MustacheJS,但在任何特定的语法上我都没有固定):

assert get_url_template('detail') == "/polls/{{ question_id }}/"
assert get_url_template('results') == "/polls/{{ question_id }}/results/"

在前端,我将简单地提供question_id并获得完整的URL。 当然,这必须适用于大多数(即使不是全部)URL模式。

有什么简单的方法可以做到这一点,还是我必须基于Django的urlresolver一起破解一些东西?

有很多JS库可以做到这一点。 一个快速的谷歌显示了django-js-reverse ,看起来不错,但是有一些未解决的问题值得一看。 您可以始终进行分叉和修复,或者至少查看它们的操作方式。

[EDIT]或者,如果您想避免使用Ajax路由,则可以编写一个Django包含标签,该标签(以某种方式-TBC)导入urlconf并呈现一个模板,该模板在JS数据结构中包装每个模板的url语法,块,以便将它们全部加载到模板中并可用。 不过,这并不是一个特别漂亮的解决方案...

我设法破解了一些可以满足我需求的简单东西,也许对某人有用。 这是一个模板标记,它用{{ name }}序列替换命名组,并将URL名称作为单个参数。

import re

from django import template
from django.core.urlresolvers import get_resolver, get_urlconf   

register = template.Library()

@register.simple_tag
def data_url(urlname):

    urlconf = get_urlconf()
    resolver = get_resolver(urlconf)

    if urlname not in resolver.reverse_dict:
        return ""

    url = resolver.reverse_dict[urlname][0][-1][0]
    url = re.sub(r'%\((.*?)\)s', '{{ \g<1> }}', url)

    return "/%s" % url

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM