6

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

视图.py:

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

模板.html:

Select CAR: <select id="car" name="car">
{% for car in car_list %}
<option value="{{ car.id }}" id="{{ car.id }}">{{ car.car_name }}</option>
{% endfor %}
</select>

Select car model: <select id="model" name="model">
{% for model in car.model_set.all %}
<option value="{{ forloop.counter }}">{{ model.model_name }}</option>
{% endfor %}
</select>

在这里,我想从我的模板(只要用户在下拉菜单中选择它)传递一个名称,例如“honda”到我的 view.py,然后它会获取相应的对象并将结果返回到我在“模型”中的模板' 下拉列表。(所以,当用户从汽车下拉列表中选择任何汽车时,基本上汽车型号列表都会刷新)

注意: Model 与 Models.py 中的 Car 是多对多关系

我在这里被困了很长时间,任何帮助都将不胜感激。

4

2 回答 2

6

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

模板.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("<strong>"+data.car+"</strong>");                
            }
        });
    });
});

视图.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 使用传递的信息更新页面。

如果你想看一个清晰的例子,请看这个链接

于 2013-06-19T14:00:38.677 回答
1

我将假设您正在使用 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 是可选的。如果您不指定字段,该方法将序列化所有字段。要对多个实例(例如查询结果)执行此操作,只需在每个实例的循环中执行此操作即可。

于 2013-06-19T13:50:34.493 回答