django-filters中使用ModelChoiceFilter实现搜索栏中外键下拉框
在使用python+django开发web版《IT资产管理系统》过程中,为实现记录搜索、过滤功能,使用了Django-Filters插件,以下是效果图:
搜索栏有三个下拉框,都是主表的外键字段,显示的是外键表的内容,通过选择下拉框的item实现在主表中过滤出需要的记录
以下是代码;
def pcstatus(request): if request is None: return pcstatustable.objects.all() def hosttype(request): if request is None: return hosttype_list.objects.all() def bl(request) : if request is None: return bl_list.objects.all()
class pclistFilter(django_filters.FilterSet): motable__hosttype_list__name = django_filters.ModelChoiceFilter(queryset=hosttype, empty_label='-Select Type-') # motable__hosttype_list__name=django_filters.CharFilter(lookup_expr='icontains', # widget=forms.TextInput(attrs={'class':'form-control','placeholder':'Type'})) # motable__name = django_filters.CharFilter(lookup_expr='icontains', widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Model'})) # user_list__dept_list__bl_list__bl_name = django_filters.CharFilter(lookup_expr='icontains', # widget=forms.TextInput(attrs={'class': 'form-control', # 'placeholder': 'BL'})) user_list__dept_list__bl_list__bl_name = django_filters.ModelChoiceFilter(queryset=bl, empty_label='-Select BL-') user_list__dept_list__dept_name = django_filters.CharFilter(lookup_expr='icontains', widget=forms.TextInput( attrs={'class': 'form-control', 'placeholder': 'Dept'})) user_list__full_name = django_filters.CharFilter(lookup_expr='icontains', widget=forms.TextInput( attrs={'class': 'form-control', 'placeholder': 'Full Name'})) # pcstatustable__statusname = django_filters.CharFilter(lookup_expr='icontains', # widget=forms.TextInput( # attrs={'class': 'form-control', # 'placeholder': 'Status'})) pcstatustable__statusname = django_filters.ModelChoiceFilter(queryset=pcstatus, empty_label='-Select Status-') asset_code = django_filters.CharFilter(lookup_expr='icontains', widget=forms.TextInput( attrs={'class': 'form-control', 'placeholder': 'FA Code'})) class Meta: model = pc_list #prefixed_order_by_field=['motable__hosttype_list_id'] fields = {'host_name':['icontains'], 'service_tag':['icontains'],
@csrf_exempt def displaypc2(request): full_path=request.get_full_path() request.session['current_path']=full_path f = pclistFilter(request.GET) siteid = request.session.get('current_site') table=f.qs.filter(site_list_id=siteid,motable__hosttype_list_id__in=(1,2,3,12),pcstatustable_id__in=(1,2,3,5)) #totalrow=table.count() #django_tables2.paginators.Paginator. table = pctable2(table) per_page=request.session.get('per_page',10) RequestConfig(request, paginate={"per_page":per_page}).configure(table) return render(request,'displaypc.html',{'table':table,'m':'dm','filter':f})
以下是模板文件
{% csrf_token %} {% load bootstrap3 %} {% load render_table from django_tables2 %} {% if filter %} <form action="" method="get" class="form form-inline"> {% bootstrap_form filter.form layout='inline' %} {% bootstrap_button 'filter' %} </form> {% else %} <form action="#" method="get"> Computer Name: <input value="{{ pcid }}" name="pcid" id="pcid"> User Name: <input value="{{ username }}" name="username" id="username"> <button name="Search">SEARCH</button> </form> {% endif %} {% render_table table 'django_tables2/bootstrap.html' %} <div class="col-md-2"> 共有: {{ table.paginator.count }}条记录,分{{ table.paginator.num_pages }}页显示,</div> <nav><ul>当前:{{ table.paginator.per_page }}行/页,切换: <a href="changeperpage?ppage=10">[10行/页] </a> - <a href="changeperpage?ppage=25" >[25行/页] </a>- <a href="changeperpage?ppage=50" >[50行/页] </a></ul></nav>