Django - 只在需要时检索信息

时间:2018-01-27 14:09:48

标签: python django

我正在构建一个网站,您可以在其中获得对象的详细视图,并且可以通过单击打开模式弹出框向用户显示有关该对象的更多数据。我想知道在Django中,如果用户选择打开模态框,只能加载这些数据 - 否则它就没有意义了。

def detail_view(request):
    ...
    extra_data = Object.objects.all().values_list('rating', flat=True) # Only required if a user open the modal box
    return render(request, 'detail.html', {'extra_data':extra_data})

关于如何在尽可能少地使用JavaScript的同时实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

这是一个非常广泛的问题,尽管以下是如何实现这一目标的通用结构。以下代码仅供参考。它只是为了展示结构。您需要两个视图,第一个视图将获取所有项目的基本信息。第二个视图填充获取所选项目的其他详细信息。

假设您将有一个用于打开模态的按钮,以显示更多详细信息。

javascript正在侦听该按钮上的click事件,它正在获取要从服务器显示的更多详细信息,然后将其显示在模式容器中。

免责声明:这不是最佳方式,这只是一个快速而肮脏的解决方案。

//Assuming there is a button with id myButton using which user will toggle modal

$("#myButton").on("click", function(e) {
  e.preventDefault();
  var modal = null;//whatver the modal is
  var model_id = 1;//store the id of the model in a accessible location and load it here
  var modalContainer = $("#modalContent") // the element which is the container of the modal which will hold its contents
  $.ajax({
  url: "/get_item_detail", //this url should call viewB
  type: "GET",
  data: {
   "id": model_id
  },
  success: function(response) {
    var html = "<div></div>" //generate your html content for the modal container
    modalContainer.html(html); //put the generated html content inside the modal Container
    modal.open(); //open the modal here
    
  },
  error: function(response) {
  
  }
  })
});
from django.shortcuts import render
from django.http import JsonResponse
import json

def viewA(request):
  #Fetch the basic info for all objects
  items = Sample.objects.all()
  return render(reqeust, "template.html", {
  "items": items
  })
  
def viewB(request):
  #Fetch the additional detail of the concerned object
  id = request.GET.get("id", None) #get id or if no id, set None
  detailed_item = Sample.objects.get(id=id)
  return JsonResponse(json.loads(detailed_item), safe=False)