当前位置: 首页 > 面试题库 >

Django表-列过滤

鲍宁
2023-03-14
问题内容

我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。


问题答案:

答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点:

答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作:

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.使用SingleTableView:另一种方法是添加包含以下形式的SingleTableView:

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

C.使用SingleTableView和django_filters:这可能是最干的方法:)这是这样做的方法:

首先定义一个过滤器:

class MyFilter(django_filters.FilterSet):
  field1 = django_filters.CharFilter()
  field2 = django_filters.CharFilter()
...

(或者你可以在Meta中添加模型过滤器(model = MyModel)

现在,像这样创建SingleTableView

class FilteredSingleTableView(SingleTableView):
  def get_table_data(self):
    f = filters.MyFilter(self.request.GET, queryset =models.MyClass.objects.all() , request=self.request )
    return f

  def get_context_data(self, **kwargs):
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs)
    f = filters.MyFilter(self.request.GET, queryset =models.MyClass.objects.all() , request=self.request )
    context['form'] = f.form
    return context

(可能f = …行有问题,但我无法使其工作。

最后,你可以像这样从urls.py调用SingleTableView

url(r'^ $',views.FilteredSingleTableView.as_view(
    table_class = tables.MyTable, 
    model = models.MyClass, 
    template_name ='mytemplate.html', 
    table_pagination = {“ per_page”:50})), 
    name ='filtered_single_table_view'
),

D.使用泛型类:这是一种更加干的DRY和django-generic-class-views方式!这实际上是C的下一步:像这样声明你的FilteredSingleTableView:

class FilteredSingleTableView(django_tables2.SingleTableView):
  filter_class = None

  def get_table_data(self):
    self.filter = self.filter_class(self.request.GET, queryset =super(FilteredSingleTableView, self).get_table_data() )
    return self.filter.qs

  def get_context_data(self, **kwargs):
    context = super(FilteredSingleTableView, self).get_context_data(**kwargs)
    context['filter'] = self.filter
    return context

现在,FilteredSingleTableView具有用于过滤器类的参数,因此你可以在其他参数中将其传递到urls.py中:

    url(r'^ $',ship.views.FilteredSingleTableView.as_view(
        model = models.MyModel,
        table_class = tables.MyTable, 
        template_name ='mytemplate.html', 
        filter_class = filters.MyFilter, 
    ),name ='myview'),

因此,你可以使用FilteredSingleTableView而无需进行修改即可过滤任何模型!

还要注意,我现在已经将过滤器另存为一个实例变量,并删除了f=filters.MyFilter(…)我在C中拥有的重复代码(get_table_data在get_context_data之前被调用-如果并非总是如此,那么我们可以添加一个get_filter实例方法来解决问题)!



 类似资料:
  • 问题内容: 我敢肯定这是一个微不足道的操作,但是我不知道它是如何完成的。 肯定有比这更聪明的东西: 我正在寻找将它们全部添加到一个查询中,例如: 如何使用值列表过滤Django查询? 问题答案: 从Django文档中:

  • 问题内容: 我在保存包含“直通”类表的m2m数据时遇到了麻烦。我想将所有选定的成员(在表单中选择)保存在通过表中。但是我不知道如何在视图中初始化“通过”表。 我的代码: 并在视图中: 我应该如何初始化要正确填充的Membership表的成员资格? 问题答案: 如果使用正常的m2m关系(不通过中间表),则可以替换: 与 但是,在使用中间表的情况下,你需要手动处理POST数据并创建具有所有必填字段的M

  • 4.5. 过滤列表 如你所知,Python 具有通过列表解析(第 3.6 节 “映射 list”)将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。 过滤列表语法: [mapping-expression for element in source-list if filter-expression] 这是你所知所爱的 列表解析 的扩展。

  • 问题内容: 假设我有以下型号 在一个视图中,我有一个带有活动过滤器的列表,称为category。我想过滤所有具有类别标签的照片对象。 我试过了: 但这匹配类别中的任何项目,而不是所有项目。 因此,如果类别是[‘holiday’,’summer’],我希望Photo带有假日和夏季标签。 能做到吗? 问题答案: 正如jpic和sgallen在评论中所建议的那样,可以.filter()为每个类别添加一个

  • 问题内容: 我是django的新手,我想制作一个简单的表格,根据文档,我可以使用django的表格模块制作表格 我想知道的是如何创建一个月的天下拉列表,即从1到31? 有些人在表单模板中使用javascript完成此操作,可以在Django中完成吗? 问题答案: 您正在寻找默认情况下呈现为html元素的。 https://docs.djangoproject.com/zh- CN/dev/ref/

  • 问题内容: 我有一个值列表,需要根据给定的布尔值列表中的值进行过滤: 我使用以下行生成一个新的过滤列表: 结果是: 这条线工作正常,但是(对我而言)看起来有点过大了,我想知道是否有更简单的方法来实现这一目标。 忠告 以下答案提供了两个好的建议: 1-不要像我一样命名列表,因为它是内置函数。 2-不要比较像我做的事情,因为这是不必要的。只需使用就足够了。 问题答案: 您正在寻找: 时序比较(py3.