【问题标题】:How to render view generated from dynamic url in Django?如何在 Django 中渲染从动态 url 生成的视图?
【发布时间】:2020-07-17 10:02:45
【问题描述】:

我有一个包含数据库中每个客户端的表的页面。我正在尝试这样做,以便在单击表中的客户端时,它只会将该客户端的数据传递到下一页。

我试图通过在我的 urls.py 中创建一个动态 url 来实现这一点,如下所示:

path("/client/<int:id>", client_view)

在 views.py 中,客户端视图使用该参数在数据库中搜索具有该 ID 的客户端,并生成一个包含该客户端名称、客户端照片位置等的 json 响应,如下所示:

def client_view(request, ID, *args, **kwargs):
    obj = Client.objects.get(id=ID)
    data = {
        "response": [obj.id, obj.first_name, obj.last_name, obj.id, obj.getImgUrl()]
    }
    return JsonResponse(data)

但是这个 url 是在初始客户端表页面上的脚本中生成的,所以我很困惑如何将此参数传递给将打开动态 url 以呈现它的页面?

客户端表格页面上的脚本:

<script>
    const clientElement = document.getElementById("client") /*table body*/
    const xhr = new XMLHttpRequest()
    const method = 'GET' //http get method
    const url = "/rosterlist/" /*trailing slash important!!*/
    const responseType = "json"


    xhr.responseType = responseType
    xhr.open(method, url) /* open request with specified method at url */
    xhr.onload = function(){ /*upon loading execute this function */
        const serverResponse = xhr.response
        const clients = serverResponse.response
        var clientsList = "";
        var i;
        for(i=0;i<clients.length;i++){
            console.log(clients[i])
            var client = "<tr class='"+clients[i].ID+"'><td><a href ='/client_view/"+clients[i].ID+"'><img src="+"'"+clients[i].image+"' alt='Man'/><a/></td><td>"+clients[i].lastname+"</td><td>"+clients[i].firstname+"</td><td>"+clients[i].ID+"</td></tr>"
            clientsList+=client;
        }
        clientElement.innerHTML = clientsList /* replace table body */
        console.log(clients)
    }
    xhr.send() /*triggers request */

</script>

如何在另一个页面上使用 xhr.open() 打开 url(脚本中的 href)?还是我应该尝试以另一种方式做到这一点?

【问题讨论】:

  • 我不确定您的系统是如何工作的。但是正如你在这里所说,as how to pass this parameter to the page that will open the dynamic url to render it? 你不能将客户端 ID 传递给该脚本所服务的页面,即调用以生成此初始客户端表的视图吗?
  • 我有一个包含客户端表的初始页面,它使用上面的脚本。它为每个客户端创建一个不同的链接(“client_view/this client's id”)。我的问题是,当每个客户的网址不同时,如何加载此网址?我的目标是让附加到每一行的超链接将该客户端的数据加载到另一个页面上。
  • 看看我的回答,如果有帮助请告诉我

标签: javascript python django django-views xmlhttprequest


【解决方案1】:

根据您的 cmets,据我所知,您似乎走在正确的道路上。

你提到

我的问题是,当每个客户端的 URL 不同时,如何加载该 URL?我的目标是让附加到每一行的超链接在另一个页面上加载该客户端的数据

您是对的,并且您通过使用href 标记为给定客户端设置url 已部分实现。您可以在脚本中像这样设置href 属性,例如

<a href="/appname/detail/{{ job.id }}/"> job.name</a>

所以你在这里设置的可以设置如下

<a href='/client_view/"+clients[i].ID+"'>"Client "+clients[i].ID</a> 

当点击时,它将通过定义的URL conf path("/client/&lt;int:id&gt;", client_view) 成功路由,然后在您的views.py 中,您可以在函数定义中简单地访问id

def client_view(request, ID, *args, **kwargs):

另外请注意,我通常会在 templates 而不是 Js 脚本中处理这些函数,但既然您已经在那里,这应该可以解决您的问题。

【讨论】:

  • 目前我是如何设置它的,我可以在每次点击时生成一个 json 响应。我想呈现该数据,但是当它不是静态的时我将如何访问该 url?例如,在第一个脚本中,我使用 xhr.open() 打开“/rosterlist/”,而对于此脚本,我必须打开“client_view/client_id”,其中客户端 ID 每次都不同。
  • 您的url conf 当前不是静态的,path("/client/&lt;int:id&gt;", client_view) 这允许id 可以是任意数字的动态行为。如果您想以静态方式访问它,则必须使用某种形式将值作为属性传递。
  • @MalekeThomas 你找到方法了吗?
  • 我看看能不能用表格完成,谢谢建议
  • @MalekeThomas 如果对您的问题有帮助,请点击勾选符号接受答案。谢谢
【解决方案2】:

我想我有一个模板,我在其中显示三个按钮查看、编辑、删除

我希望当用户单击视图按钮时,我会抓取该用户 ID 并传递链接,但以 django 方式进行。我没有 xp 和 xml,但我使用 ajax 调用。

#URLS.PY

path('/view/job/<pk>/, view_job, name="obj-detail")

#views.py

def view_job(request, pk):
    obj = get_object_or_404(Job, pk=pk)
    if request.is_ajax():
        data = {'id': obj.id,
                'first_name': obj.first_name,
                'last_name':obj.last_name}
        return JsonResponse(data)
    return PermissionDenied

#模板

            {% for obj in objects %}

            <tr class="hide-confirm">
              
              
              <td class="text-right">
                <a href="#" class="text-info mr-1 obj-view" title="View"
                  data-url="{% url'obj-view' pk=obj.pk"><i class="fas fa-eye"></i></a>
                <a href="" class="text-success mr-1" title="Edit"><i
                    class="far fa-edit"></i></a><a href=""
                  class="confirm-delete font-weight-bolder ml-1" title="Delete"><i class="far fa-trash-alt"></i></a>
              </td>
            </tr>
            {% endfor %}

    $(".obj-view").click(function (e) {
        e.preventDefault();
        var endpoint = $(this).attr("data-url");
        $.ajax({
          method: "GET",
          url: endpoint,
          success: function (data) {
            $("#obj_details_ajax").html("");
            for (const [key, value] of Object.entries(data)) {
              var k = key.replace(/_/g, ' ');
                if (value == null || value == undefined) { } else if 
                  (value.toString().startsWith('/media/')) {
                  $("#obj_details_ajax").append(`<div class="row"><div class="col-sm-5"><p 
                  class="capitalize">${k} : </p></div><div class="col-sm-6 font-weight-bold"><a href='${value}' class="text-info font-weight-bold">Download</a></div></div>`)
          } else {
            $("#obj_details_ajax").append(`<div class="row"><div class="col-sm-5"><p class="capitalize">${k} : </p></div><div class="col-sm-6 font-weight-bold"><p class="transaction_ref_number">${value}</p></div></div>`)
          }
        }
        $("#objDetail").modal('show')
      },
      error: function (error_data) {
        handleAjaxError(error_data.status)
      },
      timeout: 6000,
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- DETAIL -->
<div class="modal fade" id="objDetail" tabindex="-1" role="dialog" aria-labelledby="obj_detail" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h5 class="modal-title text-center">obj Details</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body" id="obj_details_ajax">

      </div>

      <div class="button-container m-auto">
        <a href="" class="btn btn-primary" id="edit_account_url">Edit</a>
        <a href="" class="btn btn-danger comfirm-delete" id="cancel_order">Delete</a>
      </div>
    </div>
  </div>
</div>
<!-- // ORDER DETAIL -->

【讨论】:

    【解决方案3】:

    我实际上通过使用 Django 会话弄清楚了我想要做什么。在呈现数据的视图中,我创建了一个存储 id 的会话变量:

    def client_view(request, id):
        this_client_id = id
        request.session['this_client_id'] = this_client_id
     return render(request, "pages/client_view.html)
    

    生成 JsonResponse 的视图:

    def client_data_view(request):
        this_client_id = request.session.get("this_client_id")
        obj = Client.objects.get(id=this_client_id)
        data = {
            "response": [obj.id, obj.first_name, obj.last_name, obj.id, obj.getImgUrl()]
        }
        return JsonResponse(data)
    

    所以现在在 client_view.html 页面上,我可以使用 XMLHttpRequest() 在 JS 中打开带有 jsonResponse 的 url,然后从那里开始。

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2019-09-04
      • 2021-09-01
      • 2014-04-26
      相关资源
      最近更新 更多