Django -tables2 - self.request в рендере - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь изменить табличное представление на основе имени пользователя запросов, но оно продолжает возвращать AttributeError для объекта таблицы не имеет атрибута «запрос». Я непосредственно добавил запрос в таблицу (пожалуйста, ознакомьтесь с кодами ниже), но все еще не смог выполнить его. В моем табличном классе у меня есть переопределение get_top_pinned_data для извлечения данных из базы данных на основе имени пользователя.

views.py

class ListView(LoginRequiredMixin, ExportMixin, SingleTableView):
    ...
    def get_context_data(self, **kwargs):
        context = super(ListView, self).get_context_data(**kwargs)
        table = self.get_table(**self.get_table_kwargs())
        table.request = self.request        # ADDING REQUEST DIRECTLY TO TABLE
        context[self.context_filter_name] = self.filter
        context['firstname'] = str(self.request.user.first_name)
        return context

    def get_table(self, **kwargs):
        table_class = self.get_table_class()
        table = table_class(data=self.get_table_data(), **kwargs)
        return RequestConfig(self.request, paginate={'per_page':self.paginate_by}).configure(
            table
        )

tables.py

class Table(tables.Table):
    ...
    def get_top_pinned_data(self):
        id_list = MODEL.objects.filter(USERNAME=self.request.user.username).values_list('id', flat=True)
        pinned = MODEL.objects.filter(id__in=id_list)
        return pinned

Может кто-нибудь помочь мне?


** РЕДАКТИРОВАНИЕ: добавление запроса к таблице в функции get_table

views.py

class ListView(LoginRequiredMixin, ExportMixin, SingleTableView):
    ...
    def get_context_data(self, **kwargs):
        context = super(ListView, self).get_context_data(**kwargs)
        context[self.context_filter_name] = self.filter
        context['firstname'] = str(self.request.user.first_name)
        return context

    def get_table(self, **kwargs):
        table_class = self.get_table_class()
        table = table_class(data=self.get_table_data(), **kwargs)
        table.request = self.request
        return RequestConfig(self.request, paginate={'per_page':self.paginate_by}).configure(
            table
        )

1 Ответ

1 голос
/ 22 января 2020

Я считаю, что вместо этого лучше поместить table.request в get_table,

def get_table(self, **kwargs):
    """
    Return a table object to use. The table has automatic support for
    sorting and pagination.
    """
    table_class = self.get_table_class()
    table = table_class(data=self.get_table_data(), **kwargs)
    table.request = self.request
    return RequestConfig(
        self.request, paginate=self.get_table_pagination(table)
    ).configure(table)

Если вы все еще испытываете AttributeError, запрос используется до его установки в get_table, потенциальное решение будет следующим:

def get_table(self, **kwargs):
    """
    Return a table object to use. The table has automatic support for
    sorting and pagination.
    """
    table_class = self.get_table_class()
    table = table_class(data=self.get_table_data(), request=self.request, **kwargs)
    table.request = self.request
    return RequestConfig(
        self.request, paginate=self.get_table_pagination(table)
    ).configure(table)

И получите объект запроса из вашего метода инициализации таблиц, например:

class Table(tables.Table):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super().__init__(*args, **kwargs)

    def get_top_pinned_data(self):
        id_list = MODEL.objects.filter(USERNAME=self.request.user.username).values_list('id', flat=True)
        pinned = MODEL.objects.filter(id__in=id_list)
        return pinned
...