假设我的一个urlpatterns看起来像这样。
url('^objects/update/(?P<pk>\d+)$', views.UpdateView.as_view(), name = 'update-object'),
我需要根据所选对象将用户重定向到更新页面(使用Ajax填充对象列表)。所以我想将名称url pattern 传递给JavaScript,以便在客户端构建实际的url。
我想要实现的目标:
'update-objects'
传递给函数(?P<pk>..)
替换为{pk}
objects/update/{pk}
任何提示? 感谢
使其更清晰:在渲染的那一刻,我不能做url反向因为PK还不知道。我需要制作一些javascript-urlpattern,稍后将转换为真实的url(即我的JS代码将用实际的pk值替换{pk}部分)
答案 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