from django.urls import path
from .views import ASTodasView
urlpatterns = [
path("asignatura/todas", ASTodasView.as_view(), name="as-todas"),
]
视图.py:
from .filters import AsignaturaListFilter
from .forms import AsignaturaFilterFormHelper
from .models import Asignatura, Calendario
from .tables import AsignaturasTable
from .utils import PagedFilteredTableView
class ASTodasView(PagedFilteredTableView):
filter_class = AsignaturaListFilter
model = Asignatura
table_class = AsignaturasTable
template_name = "asignatura/todas.html"
formhelper_class = AsignaturaFilterFormHelper
def get_queryset(self):
anyo_academico = Calendario.get_anyo_academico_actual()
return Asignatura.objects.filter(anyo_academico=anyo_academico)
过滤器.py:
import django_filters
from .models import Asignatura
class AsignaturaListFilter(django_filters.FilterSet):
class Meta:
model = Asignatura
fields = {
"nombre_estudio": ["icontains"],
"nombre_centro": ["icontains"],
"asignatura_id": ["exact"],
"nombre_asignatura": ["icontains"],
"cod_grupo_asignatura": ["exact"],
}
order_by = ["asignatura_id"]
forms.py格式:
from django import forms
from django.utils.translation import gettext_lazy as _
from crispy_forms.bootstrap import FormActions, InlineField
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Div, Fieldset, Layout, Submit
class AsignaturaFilterFormHelper(FormHelper):
# See https://django-crispy-forms.readthedocs.io/en/latest/form_helper.html
form_class = "form form-inline"
form_id = "asignatura-search-form"
form_method = "GET"
form_tag = True
html5_required = True
layout = Layout(
Div(
Fieldset(
"<span class='fa fa-search'></span> " + str(_("Buscar asignatura")),
Div(
InlineField("nombre_estudio__icontains", wrapper_class="col-4"),
InlineField("nombre_centro__icontains", wrapper_class="col-4"),
InlineField("asignatura_id", wrapper_class="col-4"),
InlineField("nombre_asignatura__icontains", wrapper_class="col-4"),
InlineField("cod_grupo_asignatura", wrapper_class="col-4"),
css_class="row",
),
css_class="col-10 border p-3",
),
FormActions(
Submit("submit", _("Filtrar")),
css_class="col-2 text-right align-self-center",
),
css_class="row",
)
)
表格.py:
import django_tables2 as tables
from django.utils.translation import gettext_lazy as _
from .models import Asignatura
class AsignaturasTable(tables.Table):
class Meta:
attrs = {"class": "table table-striped table-hover cabecera-azul"}
model = Asignatura
fields = (
"nombre_estudio",
"nombre_centro",
"asignatura_id",
"nombre_asignatura",
"cod_grupo_asignatura",
)
empty_text = _(
"No hay ninguna asignatura que satisfaga los criterios de búsqueda."
)
template_name = "django_tables2/bootstrap4.html"
per_page = 20
from django_filters.views import FilterView
from django_tables2 import SingleTableView
class FilterTableView(FilterView, SingleTableView):
def get_table_data(self):
return self.object_list
所以你可以这样做:
class MyTableView(FilterTableView):
model = MyModel
table_class = MyTable
filterset_class = MyFilter
data = models.MyClass.all()
form = forms.MyFilterForm(request.GET)
if request.GET.get('field1'):
data = data.filter(field1=request.GET.get('field1') )
if request.GET.get('field2'):
data = data.filter(field2=request.GET.get('field2') )
...
table = tables.MyTable(data)
这工作非常好,但它不是那么干,因为它是硬编码在视图中。
B.使用单表视图:另一种方法是添加包含以下表单的单表视图:
from django_tables2 import SingleTableView
class FilteredSingleTableView(SingleTableView):
def get_table_data(self):
data= models.MyClass.objects.all
if self.request.GET.get('field1'):
data = data.filter(field1=self.request.GET.get('field1') )
if self.request.GET.get('field1'):
data = data.filter(field1=self.request.GET.get('field1') )
return data
def get_context_data(self, **kwargs):
context = super(FilteredSingleTableView, self).get_context_data(**kwargs)
context['form'] = forms.MyFilterForm(self.request.user, self.request.GET)
return context
这是我正在使用Django 2、Crispy Forms和Bootstrap 4编写的一个应用程序的完整工作示例:
url.py:
视图.py:
过滤器.py:
forms.py格式:
表格.py:
实用程序.py:
todas.html:
希望有帮助。欢迎改进。
有一种更简单、更干净利落的方法来构建通用视图,请执行以下操作:
所以你可以这样做:
有点迟了,但无论如何。。。我也找不到任何适合列筛选的文档。有很多方法可以做到这一点:
A.手工操作:我添加一个表单,其中包含要筛选的字段,然后在我的视图中执行以下操作:
这工作非常好,但它不是那么干,因为它是硬编码在视图中。
B.使用单表视图:另一种方法是添加包含以下表单的单表视图:
这更干燥:)
C.使用SingleTableView和django_过滤器:这可能是最干燥的方法:)下面是如何做到的:
首先定义筛选器:
(或者您可以在Meta中添加一个模型过滤器(model=MyModel)
现在,创建这样的单表视图
(可能是f=行有问题。。。但我不能让它工作否则。
最后,您可以从url.py调用SingleTableView,如下所示
D.使用泛型类:这是一种更干巴巴的django泛型类视图方式!这实际上是C的下一步:像这样声明FilteredSingleTableView:
现在,FilteredSingleTableView有一个过滤器类的参数,因此您可以在url.py中传递它和其他参数:
因此,您可以使用FilteredSingleTableView而无需修改即可过滤任何模型!!
还要注意,我现在已经将过滤器保存为一个实例变量,并删除了我在C中拥有的重复代码^{>(get戋table戋data在get戋context戋data之前被调用-如果情况并非总是如此,那么我们可以添加一个
get_filter
实例方法来完成此任务)!更新23/04/2016:在热门需求之后,我创建了一个简单的Django项目,它使用通用的FilteredSingleTableView类过滤图书表。你可以在https://github.com/spapas/django_table_filtering找到它
更新2016年7月5日:请注意,您应该使用
return self.filter.qs
来返回D(我已经用这个更新了答案),否则视图将花费太长时间来呈现大表--可以在https://github.com/spapas/django_table_filtering/issues/1上找到更多信息相关问题 更多 >
编程相关推荐