blog.utek.pl Me, Myself and I

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 %}
{{ form.as_p }}
{% endblock content %}