2012-12-05 73 views
0

我有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的代码创建这个网站码:

<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的这条巨蟒dictionnary的信息。如何获得相关信息,相关信息,无关紧要?如果我尝试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> 

没问题了解析值!解决了!

回答

0

更好解决这个问题的方法... 问题是:当在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);'})) 
2

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

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

更妙的是,使用Django serializer创建JSON结果给你。

+0

以我modelChoiceField,我有:插件= forms.Select(ATTRS = { '平变化': '的javascript:lawToValidateDisplay(THIS.VALUE);'})。在点击下拉列表后,javascript函数被调用。我必须改变它来应用你的代码还是有其他方法? – rom

+0

@rom:这是JavaScript端,我发布的是* server *(p​​ython代码)生成的内容。你是说你的html select值是你在问题中发布的吗? –

+0

是的!我想我应该改变这个,因为这很丑陋。我只是不知道该怎么做,并认为这不会是一个问题。 – rom

0

首先创建在服务器侧的JSON(使用例如json模块):

import json 
json = json.dumps(queryset) 

然后解析检索JSON在JavaScript与parseJSON()(或JSON.parse现代浏览器):

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

在我的modelChoiceField中,我有:widget = forms.Select(attrs = {'onchange':'javascript:lawToValidateDisplay(this.value);'})。在点击下拉列表后,javascript函数被调用。我必须改变它来应用你的代码还是有其他方法? – rom