【问题标题】:Json filling dropdown with undefinedJson用未定义填充下拉列表
【发布时间】:2014-10-24 18:51:22
【问题描述】:

Json 用 undefined 填充我的下拉列表。

<option value="undefined">undefined</option>
<option value="undefined">undefined</option>
<option value="undefined">undefined</option>
etc

我使用以下代码来填写我的下拉菜单;

$("select[name$='product_type']").change(function(){
    var url = "/all_json_models/" + $(this).val();
    var product_type = $(this).val();
    $.getJSON(url, function(products){
        var options = '<option value="Z">Select a type</option>';
        for (var i = 0; i < products.length; i++) {
            options += '<option value="' + products[i].pk + '">' + products[i].product_description + '</option>';
        }
        $("select#id_orderline_set-0-product").html(options);
        $("select#id_orderline_set-0-product option:first").attr('selected', 'selected');
        $("select#id_orderline_set-0-product").attr('disabled', false);
    });    
})

功能(产品)的内容;

[{
    "fields": {
        "timestamp_created": "2014-09-30T20:20:06.912Z",
        "timestamp_updated": "2014-09-30T20:20:06.912Z",
        "product_price": "102",
        "product_type": 6,
        "product_description": "Roef 95X25X6"
    },
    "model": "product.product",
    "pk": 9
},
{
    "fields": {
        "timestamp_created": "2014-10-23T19:27:37.570Z",
        "timestamp_updated": "2014-10-23T19:27:37.571Z",
        "product_price": "34",
        "product_type": 6,
        "product_description": "dfsfgsdfg"
    },
    "model": "product.product",
    "pk": 20
}]

我在这里遗漏了什么,所以下拉菜单使用 pk 和产品描述?

在运行console.log(products[i]); 时,我在控制台中得到以下结果;

[ ordercalculations.js:35
{ ordercalculations.js:35
" ordercalculations.js:35
f ordercalculations.js:35
i ordercalculations.js:35
e ordercalculations.js:35
l ordercalculations.js:35
d ordercalculations.js:35
s ordercalculations.js:35
" ordercalculations.js:35
etc

添加了我的views.py

def all_json_models(request, id=None):
    if id:
        current_product_type = ProductType.objects.get(pk=id)
    else:
        current_product_type = ProductType()
    products = Product.objects.all().filter(product_type=current_product_type)
    products_serial = serializers.serialize("json", products)
    return HttpResponse(
                json.dumps(products_serial), content_type='application/json'
     )

【问题讨论】:

  • 调试你的代码。在你的product[i] 上做一个console.log,看看你得到了什么。这将帮助您了解为什么无法访问 pk 值。
  • 不会以products[i].fields.product_description 访问product_description 吗?
  • console.log = 未定义
  • products[i].fields.product_description = Uncaught TypeError: Cannot read property 'product_description' of undefined
  • 显然你的products 不是一个对象。尝试先创建一个 blanc 对象然后解析它

标签: jquery json


【解决方案1】:

试试这个

$("select[name$='product_type']").change(function(){
    var url = "/all_json_models/" + $(this).val();
    var product_type = $(this).val();
    $.getJSON(url, function(products){
        products = $.parseJSON( products );
        var options = '<option value="Z">Select a type</option>';
        for (var i = 0; i < products.length; i++) {
            options += '<option value="' + products[i].fields.pk + '">' + products[i].fields.product_description + '</option>';
        }
        $("select#id_orderline_set-0-product").html(options);
        $("select#id_orderline_set-0-product option:first").attr('selected', 'selected');
        $("select#id_orderline_set-0-product").attr('disabled', false);
    });    
});

【讨论】:

  • 添加产品 = $.parseJSON( products );成功了!非常感谢!
  • 没问题。你的结果是一个字符串。你必须先解析它:)
  • @Dwza 他没有正确访问该属性,因为products[i].product_description 指向一个不存在的属性。他需要products[i]["fields"].product_description 来访问“字段”中的孩子。
  • @Growler 如果您查看我的源代码,您会看到我已经看到并修复了它。 products[i]["fields"] 也是错误的,因为解析 json 会使对象正确访问是 products[i].fields.XY
【解决方案2】:

除了products[i].fields.product_description 来获取产品描述之外,我在您的客户端代码中看不到任何明显的问题。

问题是您正在从服务器获取字符串,因此请更新您的服务器以使用 JSON 对象而不是字符串进行回复。

如果不能,请使用$.parseJSON()products 字符串创建一个对象。

关于服务器代码:我不熟悉 Python,但是: 你确定你需要序列化products吗? 是dumps() 还是dump()? 试试mimetype 而不是content_type

【讨论】:

  • 我对Python不熟悉,但是你确定需要序列化products吗?也是dumps 还是dump?也可以试试mimetype 而不是content_type
  • console.log(typeof products); 首次加载后,不做$.parseJSON( products );,已经将产品显示为object
【解决方案3】:

问题是:products[i].product_description

从您返回的jsonproduct_description 是对象“字段”中的一个子对象。你可以通过 console.logging 整个返回的 JSON 对象 products 来判断这一点

因此您需要通过指定“字段”来访问该属性,例如:

products[i]["fields"].product_description

输出:


这是我的测试:

HTML:

  <div id="test"></div>
    <select id="test2">

    </select>

JS:

  $(document).ready(function() {
            var product_type = $(this).val();
            $.getJSON("./json/test.json", function(products){                       
                var options = '<option value="Z">Select a type</option>';
                for (var i = 0; i < products.length; i++) {
                    console.log(products);
                    options += '<option value="' + products[i].pk + '">' + products[i]["fields"].product_description + '</option>';
                }
                $("#test2").html(options);
            });    
        });

【讨论】:

  • 不,这不是他的主要问题。
  • @sebnukem 怎么会这样?当undefined 错误地访问属性时,这些值又回来了
  • 字符串上没有 product_descriptionfields 属性。请参阅登录帖子和第 4 条评论。
  • @sebnukem console.log(typeof products); 首次加载后,不执行$.parseJSON( products );,已经将产品显示为object。你能解释一下吗?我的工作正常,$.getJSON 已经将它作为一个对象获取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多