Django:使用Ajax在模板中获取数据库对象值

我想根据用户选择获取数据库对象。 我知道一个可能的解决方案可能是Ajax,但我不知道如何解决它。 这是代码:

view.py:

def automation(request): //some code car = CAR.objects.get(ida_name='honda') model = car.model_set.all() //some code 

template.html:

 Select CAR:  {% for car in car_list %} {{ car.car_name }} {% endfor %}  Select car model:  {% for model in car.model_set.all %} {{ model.model_name }} {% endfor %}  

在这里,我想从我的模板(用户在下拉列表中选择它)中传递一个名称eg.’honda’到我的view.py,然后获取相应的对象并将结果返回到我的模板中的模型’ 下拉列表。 (因此,当用户从汽车下拉列表中选择任何汽车时,基本上汽车模型列表会刷新)

注意:模型与models.py中的Car存在多对多关系

我被困在这里很长时间,任何帮助都会非常感激。

你可以使用AJAX回调你的Django代码并返回你的汽车名称:

template.html

 $(document).ready(function () { $(document).on("click",'.car_add', function() { $car_id = $(this).attr('id') $.ajax({ type: "POST", // This is the dictionary you are SENDING to your Django code. // We are sending the 'action':add_car and the 'id: $car_id // which is a variable that contains what car the user selected data: { action: "add_car", id: $car_id }, success: function(data){ // This will execute when where Django code returns a dictionary // called 'data' back to us. $("#car").html(""+data.car+""); } }); }); }); 

views.py

 def post(self,request, *args, **kwargs): if self.request.is_ajax(): return self.ajax(request) def ajax(self, request): response_dict= { 'success': True, } action = request.POST.get('action','') if action == 'add_car': car_id = request.POST.get('id','') if hasattr(self, action): response_dict = getattr(self, action)(request) car = CAR.objects.get(ida_name='car_id') response_dict = { 'car_name':car.name } return HttpResponse(simplejson.dumps(response_dict), mimetype='application/json') 

总而言之,以下是您正在做的事情:

  • 通过Ajax将汽车的“id”发送回Django。
  • Django’发布’给自己,意识到它是一个AJAX调用并调用AJAX函数
  • Django看到动作是’add_car’并执行if语句
  • Django使用您发送的ID查询数据库,返回汽车
  • Django将该数据作为JSON对象发送回页面(在本例中为字典)
  • JQuery使用传递的信息更新页面。

如果您想查看明确的示例,请参阅此链接

我将假设您正在使用AJAX请求。

您不能直接将查询结果或模型实例作为JSON返回。 但你可以序列化它。 这是一种可能性:

 from django.forms.models import model_to_dict model_to_dict(intance, fields=[], exclude=[]) 

model_to_dict有3个参数:

  1. 特定的模型实例
  2. 要包括的字段
  3. 要排除的字段

参数2和3是可选的。 如果未指定字段,则该方法将序列化所有字段。 要为多个实例(例如查询结果)执行此操作,只需在每个实例的循环中执行此操作。