找不到python url - 从AJAX访问views.py

时间:2016-10-19 05:17:15

标签: python ajax django url onclick

Python和Django的新手,我试图通过按钮点击将一些简单的ajax调用传递给我的views.py,但是,当我尝试创建一个url时,如下面的ajax代码所示,除非我在没有documentId.id的情况下直接追加,否则"?id="不会附加。

    {%for document in documents%}
       {{document.filename}}
       <input type="button" id="{{document.id}}" onclick="loadData(this)" name="load-data" value="Add"/>
    {%endfor%}

 <script type ="text/javascript">
    function loadData(documentId){
       $.ajax({
       url:"upload-data/load" + "?id=" + documentId.id,
       data: {'documentId': documentId},
       type: 'GET',
       success: function(){
          window.location.href = "http://127.0.0.1:8000/url/locations";
       }
    });
    }
 </script>

这给了我一个错误,说明找不到网址。我的urls.py下面有一行:

url(r^"upload-data/load/([0-9]+)/$', views.loadFile, name="load-data"),

除了这种方法之外,我对如何将数据提取到views.py感到难过。

def loadFile(request):
    documentId = request.GET.get('id')
    newLayer = Layer(get_object_or_404(Document, pk = documentId))
    newLayer.save()
    layers = Layer.objects.all()

    return render(request, 'url/loaded.html', { 'layers': layers})

控制台中的持久性错误是:

  

http://127.0.0.1:8000/upload-data/load/ [HTTP / 1.0 404 Not Found]

3 个答案:

答案 0 :(得分:2)

使用类似的东西:

def loadFile(request):
    documentId= request.GET.get('id', '').
    newLayer = Layer(get_object_or_404(Document, pk = documentId))
    newLayer.save()
    layers = Layer.objects.all()

    return render(request, 'url/loaded.html', { 'layers': layers})

并将您的网址更新为:

    url(r^"upload-data/load/', views.loadFile, name="load-data")

脚本就像:

<script type ="text/javascript">
    function loadData(documentId){
       $.ajax({
       url:"upload-data/load/?id="+ documentId.id,
       data: {'documentId': documentId},
       type: 'GET',
       success: function(){
          window.location.href = "http://127.0.0.1:8000/url/locations";
       }
    });
    }
 </script>

感谢。

答案 1 :(得分:2)

从上面的答案和评论中,似乎不是将id作为url param传递,而是要传递与get param相同的内容。在这种情况下,请将您的网址设置如下。

url(r^"upload-data/load/', views.loadFile, name="load-data")

并在视图中,按replacing id with documentId检查获取参数。文档ID将在您的dict named as data passed to view中。因此,请查看request.GET.get('data','')并从数据提取ID中查找

def loadFile(request):
    data = request.GET.get('data', None)
    if data:
        documentId = data['documentId']
        newLayer = Layer(get_object_or_404(Document, pk = documentId))
        newLayer.save()
        layers = Layer.objects.all()

        return render(request, 'url/loaded.html', { 'layers': layers})
    else:
        return JsonResponse({'error': 'pass document id'}, status=400)

因为您从名为documentId的javascript传递了一个get参数,而不是id。

HTH

答案 2 :(得分:1)

在JavaScript中,您需要

"upload-data/load/" + documentId.id

Django在?id=定义url中没有使用r^"upload-data/load/([0-9]+)/$'。它期望即。 upload-data/load/123代替upload-data/load?id=123

编辑,您需要id中的def loadFile(request, id)

然后你不必使用request.GET.get('id')