如何修复 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
,那么 SingleTableMixin
的 get_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 None
的 get_queryset()
方法由于错误的配置或其他原因?
我正在设置一个网上商店管理器,我依靠 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
,那么 SingleTableMixin
的 get_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 None
的 get_queryset()
方法由于错误的配置或其他原因?