我正在Django的1.10,1.11和FieldListFilter‘r_black「,因爲Django的抱怨該過濾器字段必須繼承小號solution並沒有完全適應’。
因此,從FieldListFilter繼承的過濾器的簡單更改負責Django的抱怨,而不必爲每個字段同時指定新的類。
class SingleTextInputFilter(admin.FieldListFilter):
"""
renders filter form with text input and submit button
"""
parameter_name = None
template = "admin/textinput_filter.html"
def __init__(self, field, request, params, model, model_admin, field_path):
super().__init__(field, request, params, model, model_admin, field_path)
if self.parameter_name is None:
self.parameter_name = self.field.name
if self.parameter_name in params:
value = params.pop(self.parameter_name)
self.used_parameters[self.parameter_name] = value
def queryset(self, request, queryset):
if self.value():
return queryset.filter(imei__icontains=self.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
},)
templates/admin/textinput_filter。HTML(不變):
{% load i18n %}
<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 %}
用法:
class MyAdmin(admin.ModelAdmin):
list_display = [your fields]
list_filter = [('field 1', SingleTextInputFilter), ('field 2', SingleTextInputFilter), further fields]
這真的不是我所期待的。我的問題是顯示工作文本輸入過濾器。自動填充功能很不錯,我想稍後添加它。無論如何,感謝您的回覆。 – Jazzuell
好吧,我自己想這個。我在filterspecs.py中創建了我自己的過濾器(我知道這是一種討厭的方式)。如果您嘗試使用這種方式,請注意註冊您的過濾器。您的過濾器應在系統過濾器之前註冊。與models.py相比,將過濾器分配給它所屬的屬性。 在過濾器中我使用了一些改變發佈網址的地方,其中的參數。一個城市的過濾由城市=布拉格完成,但如果您想按照過濾器列表進行過濾,請使用city__in = Prague,Wien,Dublin。如何做到這一點有許多更好的方法(查詢,AJAX,..),但我只是在學習。 – Jazzuell