django中带有ajax / dajax的动态表单

时间:2011-05-12 19:46:58

标签: python ajax django

我有一个带有查询集的简单表单来显示作业对象并允许用户选择一个。现在,我希望有一组两个单选按钮,允许用户选择“过滤选项”。如果用户选择带有单选按钮的组过滤器,我会下拉显示,允许他们选择要过滤的组。我想这样做而不必重新加载页面,所以我试图使用dajax。

我能够在dajax网站上找到一个类似的东西的例子,但是,我无法让它工作。出现单选按钮,出现下拉列表(空白)。当我单击“组”单选按钮时,下拉列表应填充所有我的组对象,但它不会。

我已经坚持了一段时间,所以任何帮助都会非常感激。

forms.py

filters = (('0', 'Group'), 
           ('1', 'Host'), 
          )

class JobSelectForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(JobSelectForm, self).__init__(*args, **kwargs)
        self.fields['jobs'].widget.attrs["size"] = 20
    jobs = forms.ModelChoiceField(queryset=Job.objects.all().order_by('name'), empty_label=None,)
    filter = forms.ChoiceField(choices=filters,
                               widget=forms.RadioSelect(attrs={'onchange': "Dajaxice.tdportal.updatefilter(Dajax.process,{'option':this.value})", 'name':'combo1', 'id':'combo1', }, 
                                                        renderer=HorizRadioRenderer),

ajax.py

def updatefilter(request, option):
    dajax = Dajax()
    options = [Group.objects.all(),
               Host.objects.all(),
               ]
    out = ""
    for o in options[int(option)]:
        out = "%s<option value='#'>%s" % (out,o,)

    dajax.assign('#combo2','innerHTML',out)
    return dajax.json()

dajaxice_functions.register(updatefilter)

模板

    {{selectForm.filter.label}}: {{selectForm.filter}}
    <br>
    <select name="combo2" id="combo2" onchange="" size="1"></select>
    <br><br>
    <form method="post" action="/tdportal/jobs/">{% csrf_token %}
        {{selectForm.jobs}}
        <br><br>
        <input type="submit" value="Edit" />   <a href="/tdportal/jobs/new/"><input type="button" name="new" value="New" /></a>
    </form>

2 个答案:

答案 0 :(得分:1)

您需要将dajaxice函数添加到select onchange以在模板中引用您的函数。

类似的东西:

<select name="combo2" id="combo2" onchange="Dajaxice.your_project.your_appname.updatefilter(Dajax.process,{'option':this.value}" size="1"></select>

(将your_project替换为您的项目名称,your_app替换为您的appname)。

另外,请确保在您的模板中包含所有必需的标题(并且它们实际存在;例如,如果您查看可以单击它们的源)。

请务必使用Google Chrome检查器(Ctrl-Shift-I)或firebug(在firefox中)进行调试。

编辑:我现在注意到你的形式有类似的东西。在查看源代码时,它如何在HTML中呈现?是不正当地逃脱了?

答案 1 :(得分:1)

我认为你在这里忘了一个%标志(value='#')和一个结束</option>

out = "%s<option value='%s'>%s</option>" % (out,o,o)