Как исправить 'Аргумент данных для tableXXX требуется' в django-tables2? - PullRequest
0 голосов
/ 04 января 2019

Я настраиваю менеджер интернет-магазина и полагаюсь на пакет django-tables2, чтобы показать список продуктов, использующих SimpleTableMixin.Я хочу добавить фильтр / возможность поиска к представлению.В соответствии с рекомендациями пакета django-tables2 для обеспечения фильтрации можно использовать пакет django-filter.Однако в случае модели со многими полями становится практически невозможным эффективно запрашивать и разрабатывать формы для них.Моя цель - использовать django-haystack, чтобы иметь единственную форму поиска ввода в качестве средства для запроса экземпляров модели, которые должны отображаться в аналогичной таблице / форме.

Я пытался добавить SimpleTableMixin впакет django-haystack универсальный SearchView.Однако я продолжаю получать следующую ошибку:

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

Пока моя реализация выглядит следующим образом:

view:

# ############## 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

urls:

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

template:

{% 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 %}

Как я могу устранить эту ошибку и обеспечить эффективные возможности поискав мой список просмотров?

1 Ответ

0 голосов
/ 05 января 2019

Вы уверены, что используете haystack.generic_views.SearchView и , а не haystack.views.SearchView?Обратите внимание, что на https://django -haystack.readthedocs.io / en / latest / views_and_forms.html написано:

Начиная с версии 2.4, представления в haystack.views.SearchView не рекомендуется в пользу новых общих представлений в haystack.generic_views.SearchView, которые используют стандартные представления на основе классов Django, которые доступны в каждой версии Django, поддерживаемой Haystack.

Таким образом, есливы используете haystack.views.SearchView, тогда get_context_data из SingleTableMixin никогда не будет вызван, поэтому table не будет помещен в ваш контекст (т. е. table будет пустым).На самом деле, поскольку мне не нравится поведение {% render_table %}, когда его параметр пуст (он ведет себя иначе, чем другие теги / фильтры Django, то есть выдает исключение, в то время как django молча игнорирует это), я обычно помещаю его в некоторые проверки {% if table %}.

ОБНОВЛЕНИЕ

Кажется, что по какой-либо причине данные не передаются в таблицу.Я не уверен, почему, я не могу проверить это прямо сейчас, но из быстрого взгляда на исходный код ваша реализация должна работать (учитывая, что SearchView имеет get_queryset, а TableMixin используетget_queryset, чтобы получить его данные).В любом случае вы пытаетесь переопределить некоторые методы TableMixin, чтобы убедиться, что таблица возвращена правильно (посмотрите TableMixin здесь: https://django -tables2.readthedocs.io / en / latest / _modules / django_tables2 /views.html ).

Я думаю, что наиболее определенным решением было бы просто укусить пулю и переопределить get_table самостоятельно.Итак, попробуйте добавить что-то вроде этого в ваш класс:

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
    )

Одна идея, которая только что возникла у меня в голове.Есть ли вероятность, что метод get_queryset() SearchView вернет None из-за неправильной конфигурации или чего-то еще?

...