Django动态过滤表单
django dynamic filtered form
我正在将一个项目从php转换为Django,并遇到了过滤菜单的问题。我有一个表单:
class SearchForm(forms.Form):
genus = forms.CharField(max_length=100)
# species
species = forms.CharField(max_length=100)
# island group
island_group = forms.ModelChoiceField(queryset=Localitymayor.objects.values_list('islandgroup', flat=True).distinct('islandgroup').exclude(islandgroup="n/a").order_by('islandgroup'), empty_label=_("Not Specified"))
# island name
island_name = forms.ModelChoiceField(queryset=Localitymayor.objects.values_list('islandname', flat=True).distinct('islandname').exclude(islandname="n/a").order_by('islandname'), empty_label=_("Not Specified"))
我的模板如下:
<form action="{% url cdrs_search %}" method="post">{% csrf_token %}
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }}: {{ field }}
</div>
{% endfor %}
</form>
现在我想根据island_group
的选择来过滤island_name
的输出。在我的php项目中,我用ajax onChange调用另一个php脚本来管理这个。然而,我有点不知道如何在Django中做到这一点。因为这是我第一次在Django中使用ajax,所以我非常感谢任何关于处理这个简单但常见的过滤菜单问题的最佳实践方法的建议。
你需要有一个视图让你的ajax脚本点击请求一个基于组的名称列表,例如
# views.py
def ajax_endpoint(request):
# leaving error checking to you
group = request.GET.get('group')
names_list = avalable_names(group) # some function or db call
return HttpResponse(json.dumps(names_list))
一个选择是在javascript中这样做。您可以使用来自jQuery的ajax请求来调用一个单独的视图。这个独立视图的任务是处理模型数据(island)名称(基于用户选择的island_group)的服务器端排序。然后,可以使用javascript使用来自视图的响应来重新填充表单。关于如何做到这一点的一些很好的例子可以在这个博客中找到(它有点密集,但非常有用),在一篇关于如何用javascript做到这一点的文章中,以及在这个教程中(强烈推荐)。
还有一个很好的SO帖子,解释了为什么有必要这样做,它可能有点迂腐,但它帮助澄清了我在创建过滤表单时的事情。
下面是对betspire.com票务表单的代码修改。这个代码片段取决于是否加载了jQuery。
这是你需要的javascript:
function update_select(select, data) {
select.find('option').remove();
select.append($('<option value="">-------</option>'));
for (var i in data) {
select.append($('<option value="'+data[i][0]+'">'+data[i][1]+'</option>'));
}
}
$('select[name=island_group]').live('change', function(e) {
$.get(
'{% url island_name_choices_for_island_group %}',
{
'island_group': $(this).val(),
},
function(data, textStatus, jqXHR) {
update_select($('select[name=island_name]'), data);
},
'json'
);
});
添加到url:
url(
r'island_name/choices/$',
'island_name_choices_for_island_group', {
}, 'island_name_choices_for_island_group',
),
添加到视图:
from django.utils import simplejson
from models import *
def island_name_choices_for_island_group(request, qs=None):
if qs is None:
# Change the default QS to your needs
# (you didn't specify it)
qs = Island.objects.all()
if request.GET.get('island_group'):
# assuming your Island model has an FK named island_group to model IslandGroup
qs = qs.filter(island_group__pk=request.GET.get('island_group'))
results = []
for choice in qs:
results.append((choice.pk, choice.name))
return http.HttpResponse(simplejson.dumps(results))
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 如何使用WCF服务和javascript表单post上传.doc文件
- Javascript生成的表单未提交
- 如何使用javascript或html下载PDF格式的填写表单
- HTML表单提交时未执行外部函数
- 如何将输入(type=text)从html表单传递到javascript函数
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- Ajax发布表单序列化,发布引号'
- 多级HTML表单
- 使用PHP通过HTML表单选项选择器过滤MYSQL结果
- JSON 填充的表单元素不使用 angularJs 过滤器进行过滤
- 我正在验证一个联系人表单.我是不是过滤太多了
- 使用 jquery.ajax 过滤下拉表单
- 如何动态过滤jQuery移动选择表单
- Django动态过滤表单
- Magento管理表单搜索/重置过滤器重定向到仪表板
- JavaScript使用HTML表单过滤JSON对象
- 绑定html表单与XSL动态过滤xml文件
- 使用多表单选择过滤json对象
- 如果表单输入中存在任何错误/过滤的单词,则显示警报