Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:JavaScript中的反向参数化url_Javascript_Django - Fatal编程技术网

Django:JavaScript中的反向参数化url

Django:JavaScript中的反向参数化url,javascript,django,Javascript,Django,假设我的一个URL模式是这样的 url(“^objects/update/(?P\d+)$”,views.UpdateView.as_view(),name=“update object”), 我需要根据所选对象将用户重定向到更新页面(对象列表使用Ajax填充)。因此,我想将命名的url模式传递给JavaScript,以便在客户端构建实际的url 我想要实现的示例: 将名称'update-objects'传递给函数 获取实际的url模式,将(?P..)替换为{pk} 将结果传递给javasc

假设我的一个URL模式是这样的


url(“^objects/update/(?P\d+)$”,views.UpdateView.as_view(),name=“update object”),

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

我想要实现的示例:

  • 将名称
    'update-objects'
    传递给函数
  • 获取实际的url模式,将
    (?P..)
    替换为
    {pk}
  • 将结果传递给javascript,结果为:
    objects/update/{pk}
  • 有什么建议吗? 谢谢



    更清楚地说:在呈现的时候,我不能做url反转,因为PK还不知道。我需要制作一种javascript urlpattern,稍后将其转换为真实的url(即,我的JS代码将用实际的pk值替换{pk}部分)

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

    Django HTML模板:

    试试这个:

    用于生成Django URL的反向方法

    再来一个

    听起来,一旦实际选择了对象,您需要进行额外的ajax调用。不要试图通过在客户端计算url来猜测你的url.conf——你以后只会给自己制造麻烦。等到你能得到一个pk,然后使用django的反向函数给你你的url(做任何其他违反的事情)

    创建一个返回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将要求您编写更多代码,可能还需要编写特定于浏览器的代码(取决于您的目标)。它还支持处理(如果还没有实现ajax调用,则需要为ajax调用实现此功能)

    恐怕我不知道您是如何从所选对象到pk的(为了简单起见,我假设它可用于
    重定向
    函数)-您可能需要在视图中进行一些处理才能到达那里


    我还没有测试上述代码,但它应该能让您了解我的建议。

    谢谢,但事实并非如此。源代码是JSON api,我唯一掌握的信息是对象的PK。我无法在呈现模板时反转url,因为此时PK不可用(还不知道)。我能做的是用一些伪PK(9999)调用reverse,希望它在urlpattern中不存在,然后用string replace 9999=>{url},我稍后(当对象的PK已知时)用正确的PK替换它。相当复杂,是吧?;)+1用于使用数据属性。绝对让这东西更优雅@migajek您还可以将视图函数更改为可选的
    pk
    ,这样您就可以在不事先知道的情况下将其反转,并将其简单地附加到URL的末尾。但在我看来,做一个虚拟的反转也不是一个可怕的主意。它只是一个简单的替换。对于DRY,可以在JSON中传递占位符令牌,这样脚本就不必关心实际的令牌是什么。占位符也可能是真正的pk这一事实让我感到不安,但可能没什么大不了的。我已经想到了这一点,这将非常容易实现,因为我使用的是django JSON RPC服务和jQuery客户端。但是,我不喜欢通过单独的请求解析每个url。这实际上意味着我将加倍AJAX请求的数量。pk来自哪里?如果它来自服务器,那么也许您可以将url与pk一起包含在json中(然后将其附加到数据属性,如acjohnson55的回答所示)。这将降低您的http开销。它来自服务器,但我不能包含该对象的所有可能url(有很多url),因为我可能在这里或那里使用它。它必须在客户端构建。因为在大多数情况下,这会用大量不必要的属性污染api。
    kwargs{'pk':obj_id}
    不是有效的pythonPerhaps我误解了这个问题,但为什么不翻译对象/更新呢/(?P\d到类似于objects/update/?pk?的东西,并让客户端js知道如何替换?pk?。在这种情况下,您需要做的只是用一些与正则表达式匹配的伪值来愚弄django的url反转,将伪值替换为?pk?(或类似值)然后将url模板存储在某个js变量中。与其他答案相比,这句话的目的不是针对OP。实际上,可以使用一个与sprintf.js配合良好的标记,而不是?pk?。这是否回答了您的问题?
    $('.object-list').on('click', 'li' function () {
      var updateUrl = $(this).data('update-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()
    
    var redirect = function(obj) {
        $.ajax({
            url: '/your-get-url-view/',
            method: 'post',
            data: {'obj_id': obj},
            success: function(url){
                window.location = url;
            }
        });
    }