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

时间:2014-04-17 07:51:29

标签: python django django-urls

我正在寻找一种使用JavaScript在前端撰写网址的简便方法。我们以Django tutorial中的网址格式为例:

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'),
]

我想从网址名称引用创建模板(我在示例中使用了MustacheJS,但我没有修复任何特定语法):

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

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

有没有简单的方法可以做到这一点,还是我必须根据Django urlresolver一起黑客攻击?

2 个答案:

答案 0 :(得分:0)

有很多JS库可以做到这一点。一个快速谷歌出现了django-js-reverse看起来相当不错,但有一些值得一看的开放性问题。你总是可以分叉和修复,或者至少看看他们是如何做到的。

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

答案 1 :(得分:0)

我设法破解了一些简单的东西,它可以做我想要的东西,也许它对某些人有用。它是一个模板标记,用{{ 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