在modelChoiceField查询集中选择列:输出混乱

时间:2012-12-05 15:57:35

标签: django select field django-queryset choicefield

我有一个用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 dictionnary中的信息。我如何得到releveMois,releveAnnee,noOrdre?如果我尝试jQuery.parseJSON,它不起作用!

修改 通过下面的评论,我明白改变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>

解决这些值不再有问题!解决!

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

import json
json = json.dumps(queryset)

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

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

答案 2 :(得分:0)

解决这个问题的更好方法...... 问题是:在values中选择queryset的几列时,会混淆输出。解决方案是使用only代替(在过滤器之前)。

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