django-filters中使用ModelChoiceFilter實現搜索欄中外鍵下拉框

在使用python+django開發web版《IT資產管理系統》過程中,爲實現記錄搜索、過濾功能,使用了Django-Filters插件,以下是效果圖:

搜索欄有三個下拉框,都是主表的外鍵字段,顯示的是外鍵表的內容,通過選擇下拉框的item實現在主表中過濾出需要的記錄

4

以下是代碼;

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>

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章