【问题标题】:Django: Get database object value in template using AjaxDjango:使用 Ajax 在模板中获取数据库对象值
【发布时间】:2013-06-16 02:04:39
【问题描述】:

我想根据用户选择来获取数据库对象。我知道一种可能的解决方案可能是 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: <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>

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

注意:Model在models.py中与Car是多对多关系

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

【问题讨论】:

    标签: ajax django jquery


    【解决方案1】:

    您可以使用 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>");                
                }
            });
        });
    });
    

    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 'posts' 到自己,意识到它是一个 AJAX 调用并调用 AJAX 函数
    • Django 看到 action 是 'add_car' 并执行 if 语句
    • Django 使用您发送的 id 查询数据库,返回一辆车
    • Django 将该数据作为 JSON 对象(在本例中为字典)发送回页面
    • JQuery 使用传递的信息更新页面。

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

    【讨论】:

    • 你的总结对我了解基本流程很有帮助。但我并不完全想得到车名。我想从汽车“模型”中获取数据,并让模型名称显示在我的模板上。 Model 和 Car 是 models.py 中的不同类。我已经更新了我上面的问题。谢谢@JcKelley!
    • 例如,用户选择“本田”,然后另一个下拉菜单现在显示“雅阁、思域等”?
    • 然后你只需查询 car.models 数据库,然后像上面的代码一样在字典中发回你的数据。
    • 我添加了一个链接,该链接显示了您问题的清晰示例。
    • 非常感谢!该链接确实有帮助!经过几次尝试,我得到了我想要的!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多