我和xadmin后台自定义的爱恨纠葛之自定义控件添加,需求是给xadmin后台的list页面添加一个筛选框,可以选择不同的类目,只返回属于该类目的数据
最终效果
准备控件用到的html
找个用到search_fields字段的页面
将搜索框的HTML直接复制下来
<form class="navbar-form navbar-left" action="" method="get">
<div class="input-group search-group">
<input id="searchbar" class="form-control" type="text" name="_q_" value="" placeholder="搜索 公司信息">
<span class="input-group-btn">
<button class="btn btn-primary" type="submit">
<i class="fa fa-search"></i>
</button>
</span>
</div>
</form>
转变成我们自己的html,相关的name、id可以自定义,我把原来的搜索按钮隐藏了,目的是想实现在点击筛选项时调用提交按钮
{% load i18n %}
<form class="navbar-form navbar-left" action="" method="get">
<div class="input-group search-group">
<select name="search_field" class="select form-control" id="search_field" onchange="submitselect()">
<option value="">请选择筛选项</option>
<option value="0">全部</option>
</select>
# 注意我这里把原来的搜索按钮隐藏了
<button class="btn btn-primary" type="submit" id="btn" style="display: none"></button>
</div>
</form>
给下拉框添加动态数据,写相关的js
<script>
# 页面加载时访问自己写的接口获取筛选项
$(document).ready(function () {
$.getJSON('接口',function (data) {
if(data.status==0){
var btnobj = data.data['xxx'];
for(var i=0;i<btnobj .length;i++){
$('#search_field').append("<option value='"+btnobj[i].id+"'>"+btnobj[i].name+"</option>")
}
}
})
});
# 点击下拉框中的筛选项时触发提交按钮
function submitselect() {
$('#btn').click()
}
</script>
将写好的控件添加到adminx文件中
将下面代码加入adminx文件,后续在需要自定义控件的类中将isExcute置为True就可以开启控件了
from django.template.context import RequestContext
from xadmin.views import BaseAdminPlugin, ListAdminView
from django.template import loader
def get_context_dict(context):
if isinstance(context, RequestContext):
ctx = context.flatten()
else:
ctx = context
return ctx
class CustomizePlugin(BaseAdminPlugin):
isExcute = False
def init_request(self, *args, **kwargs):
return bool(self.isExcute)
def block_nav_form(self, context, nodes):
nodes.append(loader.render_to_string('控件.html', get_context_dict(context)))
xadmin.site.register_plugin(CustomizePlugin, ListAdminView)
在需要控件的类中开启isExcute,重写查询方法
class ModelAdmin(object):
list_display = []
isExcute = True
def queryset(self):
qs = Model.objects.all()
# 根据选择的筛选项查询属于该类目的数据,如果没传入类目则返回所有数据
search_field = int(self.request.GET.get('search_field',0))
if search_field:
qs = qs.filter(id=search_field)
return qs
OK!