使用django-table2的django-filter的CBV

问题描述

我想将django-table2与django-filter一起使用。 我完成了django-table2文档所说的操作,但模板中未显示django-filter的形式

这些是我的代码

    # Views.py 
    from django_filters.views import FilterView
    import django_filters
    from django_tables2 import SingleTableView
    
    class MYFilter(django_filters.FilterSet):
        class Meta:
            model = MyModel
            fields = ['field1','field2' ]
    
    class MyView(SingleTableView,FilterView):
         model = MyModel
         table_class = MyTable
         template_name = 'my_template.html'
         filterset_class = MYFilter
    
    # tables.py 
    import django_tables2 as tables
    class MyTable(tables.Table):
        class Meta:
            model = MyModel
            fields = ("field1","field2",)
    
    # my_template.html
    {% load render_table from django_tables2 %}
    {% if filter %}
    <form method="get">
        {{ filter.form.as_p }}
        <input type="submit" />
    </form>
    {% endif %}
    {% if table %}
    <div class="table-responsive">
        {% render_table table %}
    </div>
    {% endif %}

表格可以正确显示,但是表格没有显示。我的代码有什么问题?

解决方法

正如@ willem-van-onsem所说,您使用两个baseclasses。因此,您必须更改此行:

class MyView(SingleTableView,FilterView):

对此:

class MyView(SingleTableMixin,FilterView):

在此link中,您可以看到django-table2django-filter文件供使用。

,

方法解析顺序(MRO)将过滤器视图设置得很低,以至于没有影响,

IntStream.range(0,test.size()).map(i -> test.get(i).get(i)).sum();

这很重要,因为>>> MyView.__mro__ (<class 'MyView'>,<class 'django_tables2.views.SingleTableView'>,<class 'django_tables2.views.SingleTableMixin'>,<class 'django_tables2.views.TableMixinBase'>,<class 'django.views.generic.list.ListView'>,<class 'django_filters.views.FilterView'>,<class 'django.views.generic.list.MultipleObjectTemplateResponseMixin'>,<class 'django.views.generic.base.TemplateResponseMixin'>,<class 'django.views.generic.list.BaseListView'>,<class 'django_filters.views.BaseFilterView'>,<class 'django_filters.views.FilterMixin'>,<class 'django.views.generic.list.MultipleObjectMixin'>,<class 'django.views.generic.base.ContextMixin'>,<class 'django.views.generic.base.View'>,<class 'object'>)将覆盖BaseFilterView方法,但是由于get首先出现在MRO中,因此不会产生任何影响。如果我们交换父母,那么:

BaseListView

MRO是:

class MyView(FilterView,SingleTableView):
    # …

,因此将使用>>> MyView.__mro__ (<class 'MyView'>,<class 'django_tables2.views.SingleTableView'>,<class 'object'>)的{​​{1}}逻辑。