Django:在JavaScript中反向参数化url

时间:2013-01-30 15:09:46

标签: javascript django

假设我的一个urlpatterns看起来像这样。

url('^objects/update/(?P<pk>\d+)$', views.UpdateView.as_view(), name = 'update-object'),

我需要根据所选对象将用户重定向到更新页面(使用Ajax填充对象列表)。所以我想将名称url pattern 传递给JavaScript,以便在客户端构建实际的url。

我想要实现的目标:

  1. 将名称'update-objects'传递给函数
  2. 获取实际网址格式,将(?P<pk>..)替换为{pk}
  3. 将结果传递给javascript,结果为:objects/update/{pk}
  4. 任何提示? 感谢


    使其更清晰:在渲染的那一刻,我不能做url反向因为PK还不知道。我需要制作一些javascript-urlpattern,稍后将转换为真实的url(即我的JS代码将用实际的pk值替换{pk}部分)

3 个答案:

答案 0 :(得分:4)

实际的URL反转必须在服务器端进行。有几种方法可以做到这一点,其中最优雅的方法可能取决于您为此设置的脚本和标记的准确程度。我最近做的一件事是使用HTML5数据属性将URL附加到逻辑元素,这些属性很容易使用jQuery检索。如果你不使用jQuery,我会把它留给你翻译成纯JS。你没有为你的客户端提供任何代码或细节,所以我在这里黑暗中拍摄,但也许这会给你一个想法:

Django HTML模板:

<ul class="object-list">
 {% for object in objectList %}
  <li data-update-url="{% url update-objects object.pk %}">object.name</li>
 {% endfor %}
</ul>

JS:

$('.object-list').on('click', 'li' function () {
  var updateUrl = $(this).data('update-url')
  ...
});

答案 1 :(得分:2)

听起来你需要在实际选择对象后再进行一次ajax调用。不要尝试通过尝试在客户端编制url来猜测你的url.conf - 你以后会为自己制造麻烦。等到你可以得到一个PK,然后使用django的反向功能给你你的网址(做任何违反DRY的事情)。

如何创建一个返回url的简单视图 -

from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseBadRequest

def get_url(request):
    if request.is_ajax() and request.method == 'POST':
        obj_id = request.POST['obj_id']
        url = reverse('object-update', kwargs{'pk': obj_id})
        return HttpResponse(obj_id)
    return HttpResponseBadRequest()

然后编写一个javascript函数,使用对新视图的ajax调用获取url,然后重定向。一旦选择了对象,就会调用此函数。我建议使用JQuery来执行此操作,纯javascript将要求您编写更多代码,并可能编写特定于浏览器的代码(取决于您的目标)。它还支持处理django's csrf protection(如果你还没有,你需要为ajax调用实现这个)。

var redirect = function(obj) {
    $.ajax({
        url: '/your-get-url-view/',
        method: 'post',
        data: {'obj_id': obj},
        success: function(url){
            window.location = url;
        }
    });
}

我担心我不知道你是如何从所选对象到pk的(为简单起见我假设它可用于redirect函数) - 你可能需要做一些处理为了实现这一目标。

我没有测试过上面的代码,但它应该让你知道我的建议。

答案 2 :(得分:1)

试试这个:

生成Django网址的反向方法
https://github.com/mlouro/django-js-utils

再多一个 https://github.com/Dimitri-Gnidash/django-js-utils