Django 進階學習 - 文本框過濾

默認情況下django可以對列進行過濾, 但大多數(shù)是對Relationship列通過list_filter 直接指定field name就可以方便的進行過濾了, 但是如果實現(xiàn)文本框輸入過濾屬性, 然后通過按鈕觸發(fā)事件后來過濾只能通過自定義Django filter來實現(xiàn)

首先自定義一個filter類

filters.py 默認情況下如果沒有filters.py需要在app目錄新建此模塊, 推薦命名filters.py, 下面這個類是通用的, 所以我們要基于模型的某個字段來定義一個Filter類,繼承SingleTextInputFilter(還是在filters.py)

from django.contrib.admin import ListFilter
from django.utils.translation import ugettext_lazy as _

class SingleTextInputFilter(ListFilter):
    """
    renders filter form with text input and submit button
    """
    parameter_name = None
    template = "admin/textinput_filter.html"

    def __init__(self, request, params, model, model_admin):
        super(SingleTextInputFilter, self).__init__(
            request, params, model, model_admin)
        if self.parameter_name is None:
            raise ImproperlyConfigured(
                "The list filter '%s' does not specify "
                "a 'parameter_name'." % self.__class__.__name__)

        if self.parameter_name in params:
            value = params.pop(self.parameter_name)
            self.used_parameters[self.parameter_name] = value

    def value(self):
        """
        Returns the value (in string format) provided in the request's
        query string for this filter, if any. If the value wasn't provided then
        returns None.
        """
        return self.used_parameters.get(self.parameter_name, None)

    def has_output(self):
        return True

    def expected_parameters(self):
        """
        Returns the list of parameter names that are expected from the
        request's query string and that will be used by this filter.
        """
        return [self.parameter_name]


    def choices(self, cl):
        all_choice = {
            'selected': self.value() is None,
            'query_string': cl.get_query_string({}, [self.parameter_name]),
            'display': _('All'),
        }
        return ({
            'get_query': cl.params,
            'current_value': self.value(),
            'all_choice': all_choice,
            'parameter_name': self.parameter_name
        }, )

class IpFilter(SingleTextInputFilter):
    """基于IP過濾, 繼承SigleTextInputFilter"""
    title = "IP"
    parameter_name = 'ip'  #作用model的字段名
    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(ip__iexact=self.value()) # 這里自定義過濾條件. self.value() 是文本框輸入的值.

自定義filter template

admin/textinput_filter.html, 直接放到本項目的template目錄即可, 千萬不要放到django包目錄下的admin template目錄, 如果你了解django 模版檢索的過程優(yōu)先級, 你應該知道我說的意思. 這里我放到$MYAPP/templates/admin/textinput_filter.html位置

<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>

{#i for item, to be short in names#}
{% with choices.0 as i %}
<ul>
    <li>
        <form method="get">
            <input type="search" name="{{ i.parameter_name }}" value="{{ i.current_value|default_if_none:"" }}"/>

            {#create hidden inputs to preserve values from other filters and search field#}
            {% for k, v in i.get_query.items %}
                {% if not k == i.parameter_name %}
                    <input type="hidden" name="{{ k }}" value="{{ v }}">
                {% endif %}
            {% endfor %}
            <input type="submit" value="{% trans 'apply' %}">
        </form>
    </li>

    {#show "All" link to reset current filter#}
    <li{% if i.all_choice.selected %} class="selected"{% endif %}>
        <a href="{{ i.all_choice.query_string|iriencode }}">
            {{ i.all_choice.display }}
        </a>
    </li>
</ul>
{% endwith %}

最后配置admin.py

admin.py

from controller.filters import IpFilter

class TriggerAdmin(admin.ModelAdmin):
    empty_value_display = u'無規(guī)則'
    list_display = ('__str__', 'id', 'ip', 't_type',
            'get_converge', 'get_switch', 'level')
    search_fields = ('description',)
    list_filter = (IpFilter, 't_type', 'converge_role', 'switch_role', 'level') # 直接把IpFilter類寫進去

配置完成

注意: 轉(zhuǎn)載請注明原地址, 首發(fā)平臺http://omem.me, 及作者.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容