2

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

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

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

我想要实现的示例:

  1. 将名称传递'update-objects'给函数
  2. 获取实际的 url 模式,替换(?P<pk>..){pk}
  3. 将结果传递给 javascript,结果是:objects/update/{pk}

有小费吗?谢谢


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

4

4 回答 4

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')
  ...
});
于 2013-01-30T15:27:32.400 回答
2

听起来您需要在实际选择对象后进行额外的 ajax 调用。不要试图通过尝试在客户端计算出 url 来猜测你的 url.conf - 你以后只会给自己找麻烦。等到你能得到一个 pk,然后使用 django 的 reverse 函数给你你的 url(做任何其他事情都违反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 的 csrf 保护(如果还没有的话,你需要为 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函数可用)——你可能需要在视图中进行一些处理才能到达那里。

我没有测试过上面的代码,但它应该让你对我的建议有所了解。

于 2013-01-30T18:26:43.283 回答
1

试试这个:

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

还有一个
https://github.com/Dimitri-Gnidash/django-js-utils

于 2013-01-30T17:54:18.563 回答
0

如果您的 URL 中只有一个 PK 字段,您可以使用任意数字(例如0)对其进行解析,然后根据需要替换该数字。

在我的场景中,我的 URL 有pk一个upload_id,所以我必须在最右边的 0 实例上替换为<upload_id>,JS 将根据需要替换此字符串出现:

detele_url_upload_id_0 = reverse(f'{APP_NAME}:api_upload_delete', args=[pk, 0])
prefix, suffix = detele_url_upload_id_0.rsplit('0', 1)
context['generic_delete_url'] = prefix + '<upload_id>' + suffix

然后在JS中:

const deleteUrl = genericDeleteUrl.replace('<upload_id>', uploadId)
于 2021-10-04T06:43:38.417 回答