23wrz/100
Dynamiczne filtrowanie pól w formularzu Django
Dynamiczne filtrowanie pola w formularzu django z wykorzystaniem innego pola w tym samym formularzu.
Z wykorzystaniem jQuery.
Model formularza:
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(self.__class__, self).__init__(*args, **kwargs)
if self['fieldToFilterWith'].data:
self.fields['fieldToFilter'].queryset = MyModel2.objects.filter(fieldToFilterWith__id=int(self['fieldToFilterWith'].data))
else:
self.fields['fieldToFilter'].queryset = MyModel2.objects.none()
class Meta:
model = MyModel
exclude = ("modifier", "adder", "added", "visible")
class Media:
js = ("js/plugins/dChoice.js",)
Widok zwracający przefiltrowaną listę:
def get_filtered_list(request, fieldToFilterWith_id):
regions = MyModel2.objects.filter(fieldToFilterWith__id=fieldToFilterWith_id)
return HttpResponse(serializers.serialize("json", regions, fields=("name",)), mimetype="application/json")
urls.py dla widoku:
url(r'feed/d/(\d+)/$', 'myapp.views.get_filtered_list', name='feed_get_filtered_list'),
js/plugins/dChoice.js:
(function($){
$.fn.extend({
dChoice: function(options) {
var defaults = {
url: '',
field: ''
};
var o = $.extend(defaults, options);
return this.each(function(){
var parent = this;
$("#"+o.field).change(function(){
var id_c = $(this).val();
$.getJSON(o.url + id_c + "/", function(data){
$(parent).html("");
$(parent).append($("
").attr("value","").text("---------"));
for (elem in data){
$(parent).append($("
").attr("value",data[elem].pk).text(data[elem].fields.name));
}
});
})
});
}
});
})(jQuery);
Szablon formularza z polami do filtrowania:
{% block scripts %}
{{ form.media }}
{% endblock %}
{% block content %}
{% endblock content %}