如果对于要过滤的字段,您有超过10个值,则过滤侧边栏开始变得丑陋且难以使用。
我正在寻找一种解决方案,用下拉选项(组合框)或类似的东西替换<li>
,以解决同样的问题。
答案 0 :(得分:30)
我无法评论答案,所以我会在这里添加beholderrk的答案。
dropdown_filter.html
或类似dropdown_filter.html
在filters.py
中创建一个新的过滤器类:
from django.contrib.admin.filters import AllValuesFieldListFilter
class DropdownFilter(AllValuesFieldListFilter):
template = 'admin/dropdown_filter.html'
现在您可以在管理员类中使用此过滤器:
class SomeAdmin(admin.ModelAdmin):
# ...
list_filter = (('country', DropdownFilter),)
效果很好!
答案 1 :(得分:28)
使用来自feincms的filter.html
{% load i18n %}
<script type="text/javascript">var go_from_select = function(opt) { window.location = window.location.pathname + opt };</script>
<h3>{{ title }}</h3>
<ul class="admin-filter-{{ title|cut:' ' }}">
{% if choices|slice:"4:" %}
<li>
<select style="width: 95%;"
onchange="go_from_select(this.options[this.selectedIndex].value)">
{% for choice in choices %}
<option{% if choice.selected %} selected="selected"{% endif %}
value="{{ choice.query_string|iriencode }}">{{ choice.display }}</option>
{% endfor %}
</select>
</li>
{% else %}
{% for choice in choices %}
<li{% if choice.selected %} class="selected"{% endif %}>
<a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li>
{% endfor %}
{% endif %}
</ul>
答案 2 :(得分:28)
谢谢@beholderrk,@ gedas和@ jk-laiho!我将其打包成reusable app。
安装:
pip install django-admin-list-filter-dropdown
在settings.py
中启用:
INSTALLED_APPS = (
...
'django_admin_listfilter_dropdown',
...
)
在admin.py
中使用:
from django_admin_listfilter_dropdown.filters import (
DropdownFilter, ChoiceDropdownFilter, RelatedDropdownFilter
)
class EntityAdmin(admin.ModelAdmin):
...
list_filter = (
# for ordinary fields
('a_charfield', DropdownFilter),
# for choice fields
('a_choicefield', ChoiceDropdownFilter),
# for related fields
('a_foreignkey_field', RelatedDropdownFilter),
)
这是它的样子:
答案 3 :(得分:3)
一个简单的选择是使用django-grappelli,它将所有过滤器替换为下拉列表。
答案 4 :(得分:2)
您可以将django安装中的管理模板复制到项目中的templates / admin文件夹中。
然后,您需要在要显示输出的表单或模板中执行以下任何操作:
如果您正在使用表单,您希望将列表选项发布回数据库,您可以在model.py中,在您可以选择的字段上输入一些像这样:
choice = forms.IntegerField(widget=forms.Select(choices=CHOICES))
如果只是要在页面上显示,那么您将在模板标签上输出如下内容:
<select>
{% for choices in object.details.all %}
<option> {{ object.choice }} </option>
{% endfor %}
</select>
答案 5 :(得分:2)
http://djangosuit.com/还提供了列表过滤器的下拉列表。
答案 6 :(得分:0)
最佳解决方案是在@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
super.onCreateOptionsMenu(menu, inflater);
final SwitchCompat switch1= (SwitchCompat) menu.findItem(R.id.switch_wifi).getActionView().findViewById(R.id.switchForActionBar);
switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
fab.setVisibility(View.VISIBLE);
}
else{
fab.setVisibility(View.GONE);
}
}
});
中创建一个新模板,并实现@beholderrk建议的HTML代码。刚刚为客户实现它,它工作得很好。
admin/filter.html
的问题在于它失去了正确的显示。它将显示DropdownFilter and RelatedDropdownFilter
,Charfield(choices=xxx)
等,而不是True
的翻译字符串。
答案 7 :(得分:0)
能否请您举一个完整的例子。它像以前一样显示。 这是我的代码
from django.contrib import admin
from pages.models import Post, Device, DeviceType, DeviceModel, Ipaddress, DeviceGroup, Location,Department,Comment
from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter
class CommentInline(admin.TabularInline):
model = Comment
class IpaddressAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('ipaddress',)}
# model=Ipaddress
search_fields = ['ipaddress', ]
#
list_display = ('ipaddress', 'machinename', 'user', 'department','location',)
list_filter = (
('user', DropdownFilter),
('department', RelatedDropdownFilter),
('location', RelatedDropdownFilter),
)
答案 8 :(得分:0)
django_admin_listfilter_dropdown
的效果很好,但是似乎我们无法将其与 admin.RelatedOnlyFieldListFilter
一起使用(从现有值中获取动态过滤器列表)。
这是一种使用方式吗?我尝试了一些语法:
('specialty', RelatedDropdownFilter, admin.RelatedOnlyFieldListFilter),
或
(('specialty', RelatedDropdownFilter), admin.RelatedOnlyFieldListFilter),
...
但没有成功。
答案 9 :(得分:-1)
我不喜欢到目前为止提供的所有解决方案。
为什么?如果对于要作为筛选依据的字段,您有10个以上的值,则列表视图框也不是那么方便。我建议使用django admin的标准搜索字段功能,该功能将向您显示搜索字段:
class BooksAdmin(admin.ModelAdmin):
list_display = ('ISBN', 'title')
search_fields = ('ISBN',)
# instead of: list_filter = ('ISBN',)
ordering = ('title',)