如何修复 django-tables2 中的 'Argument data to tableXXX is required'?

How to fix 'Argument data to tableXXX is required' in django-tables2?

我正在设置一个网上商店管理器,我依靠 django-tables2 包来显示使用 SimpleTableMixin 的产品列表。我想将 filter/search 功能添加到视图中。正如 django-tables2 包所推荐的那样,可以依赖 django-filter 包来提供过滤。但是,对于具有许多字段的模型,几乎不可能有效地查询和开发这些字段的表单。我的目标是使用 django-haystack 有一个单一的输入搜索表单作为查询应该以类似 table/form.

显示的模型实例的手段

我尝试将 SimpleTableMixin 添加到 django-haystack 包通用 SearchView 中。但是我不断收到以下错误:

TypeError at /manager/front/products/
Argument data to ProductTable is required

到目前为止我的实现如下:

查看:

# ############## Products ############## (previous implementation with django-filter)
# @method_decorator(staff_member_required, name='dispatch')
# class ProductList(SingleTableMixin, FilterView):
#     model = Product
#     table_class = tables.ProductTable
#     filterset_class = filters.ProductFilter
#     template_name = 'manager/front/products/product_list.html'

############## Products ##############
@method_decorator(staff_member_required, name='dispatch')
class ProductList(SingleTableMixin, SearchView):
    model = Product
    table_class = tables.ProductTable
    template_name = 'manager/front/products/product_list.html'

表:

import django_tables2 as tables
from front.models import Product

class ProductTable(tables.Table):
    class Meta:
        model = Product
        template_name = 'django_tables2/bootstrap.html'

search_indexes.py:

from haystack import indexes
from front.models import Product

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return Product

网址:

path('front/products',views.ProductList.as_view(),name="manage_products"),    

模板:

{% extends 'base_site.html' %}
{% load render_table from django_tables2 %}
{% block content_title %}Manage Products{% endblock%}
{% block content %}
<form action="" method="get" class="form form-inline">
    {{ form }}
    <button class="btn btn-default" type="submit">Search</button>
</form>
{% render_table table %}
{% endblock %}

如何消除该错误并为我的列表视图提供有效的搜索能力?

您确定您使用的是 haystack.generic_views.SearchView 而不是 haystack.views.SearchView?请注意 https://django-haystack.readthedocs.io/en/latest/views_and_forms.html 上写着:

As of version 2.4 the views in haystack.views.SearchView are deprecated in favor of the new generic views in haystack.generic_views.SearchView which use the standard Django class-based views which are available in every version of Django which is supported by Haystack.

因此,如果您使用 haystack.views.SearchView,那么 SingleTableMixinget_context_data 将永远不会被调用,因此不会将 table 放入您的上下文中(即 table 将为空)。实际上,因为我不喜欢 {% render_table %} 参数为空时的行为(它的行为与其他 Django tags/filters 不同,即它抛出异常,而 Django 的则默默地忽略它)我通常把它放在一些 {% if table %} 检查。

更新

似乎出于某种原因数据没有传递给 table。我不确定为什么,我现在无法对其进行测试,但通过快速查看源代码,您的实现 应该可以正常工作 (考虑到 SearchView 有一个 get_queryset TableMixin 使用 get_queryset 检索其数据)。在任何情况下,您都尝试覆盖 TableMixin 的某些方法以确保 table 被正确返回(在这里查看 TableMixin:https://django-tables2.readthedocs.io/en/latest/_modules/django_tables2/views.html)。

我认为最明确的解决方案是硬着头皮自己覆盖 get_table。所以,尝试将这样的内容添加到您的 class:

def get_table(self, **kwargs):
    table_class = self.get_table_class()
    # I only change this line from the original to make sure that the self.get_queryset() is called to return the data
    table = table_class(data=self.get_queryset(), **kwargs)
    return RequestConfig(self.request, paginate=self.get_table_pagination(table)).configure(
        table
    )

我脑子里突然冒出一个想法。是否有可能 SearchView returns Noneget_queryset() 方法由于错误的配置或其他原因?