【问题标题】:Selection of columns in a modelChoiceField queryset: output messed up在 modelChoiceField 查询集中选择列:输出混乱
【发布时间】:2012-12-05 15:57:35
【问题描述】:

我有一个用 Django 创建的 modelChoiceField:

lawsToValidate=forms.ModelChoiceField(queryset=LawsIdsModel.objects.filter(validated=0).values("releveAnnee", "releveMois", "noOrdre"), widget=forms.Select(attrs={'onchange': 'javascript: lawToValidateDisplay(this.value);'}))

django 代码创建了这个 html 代码:

<option value="{'releveMois': 1L, 'noOrdre': 2L, 'releveAnnee': 2009L}">{'releveMois': 1L, 'noOrdre': 2L, 'releveAnnee': 2009L}</option>

django 代码在单击下拉列表后立即调用我的 jquery 函数。如果我在我的 javascript 函数中显示选定的值,这就是我所拥有的:

{'releveMois': 1L, 'noOrdre': 3L, 'releveAnnee': 2009L}

如何在 jquery / javascript 中从这个 python 字典中获取信息。如何获得 releveMois、releveAnnee、noOrdre?如果我尝试 jQuery.parseJSON,它不起作用!

编辑: 通过下面的 cmets,我了解到最好更改 html 输出。这是我生成下拉列表的模板代码:

<div id="lawsToValidateChoice" class="fieldWrapper">
            {{ form.lawsToValidate.errors }}
            <select  onchange="javascript: lawToValidateDisplay(this.value);" name="lawsToValidate" id="id_lawsToValidate">
                <option value="" selected="selected">Select a law to validate</option>
                {% for law in form.lawsToValidate.field.queryset %}
                    <option value="{{ law.releveAnnee }},{{ law.releveMois }},{{ law.noOrdre }}">releveAnnee={{ law.releveAnnee }}, releveMois={{ law.releveMois }}, noOrdre={{ law.noOrdre }}</option>
                {% endfor %}
            </select>
        </div>

解析值不再有问题!解决了!

【问题讨论】:

    标签: django select field django-queryset choicefield


    【解决方案1】:

    您需要使用json module 来序列化您的结果,而不是您的字典的str 转换。

    return HttpResponse(json.dumps(result), mimetype="application/json")
    

    更好的是,使用JSONResponse() objectDjango serializer 为您创建JSON 结果;第一个是完全替换编码为 JSON 的 HttpResponse 对象,并确保使用正确的 mimetype。

    【讨论】:

    • 在我的 modelChoiceField 中,我有:widget=forms.Select(attrs={'onchange': 'javascript: lawToValidateDisplay(this.value);'})。单击下拉列表后立即调用 javascript 函数。我必须更改它以应用您的代码还是有其他方法?
    • @rom:这是 JavaScript 方面,我发布的是 server(python 代码)产生的内容。您是说您的 html select 值是您在问题中发布的内容吗?
    • 没错!我想我应该改变它,因为它很丑陋。我只是不知道该怎么做,并认为这不会有问题。
    【解决方案2】:

    首先在服务器端创建一个 JSON(例如使用json 模块):

    import json
    json = json.dumps(queryset)
    

    然后使用parseJSON()(或现代浏览器的JSON.parse)在JavaScript 中解析检索到的JSON:

    var json = $.parseJSON(jsonVar);
    console.log(json.releveMois);
    

    【讨论】:

    • 在我的 modelChoiceField 中,我有:widget=forms.Select(attrs={'onchange': 'javascript: lawToValidateDisplay(this.value);'})。单击下拉列表后立即调用 javascript 函数。我必须更改它以应用您的代码还是有其他方法?
    【解决方案3】:

    解决这个问题的更好方法... 问题是:当在queryset 中选择带有values 的几列时,它会弄乱输出。解决方案是改用only(在过滤器之前)。

    lawsToValidate=forms.ModelChoiceField(queryset=LawsIdsModel.objects.only("releveAnnee", "releveMois", "noOrdre").filter(validated=0), widget=forms.Select(attrs={'onchange': 'javascript: lawToValidateDisplay(this.value);'}))
    

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 2011-12-31
      • 2013-11-29
      • 2011-07-13
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多