Django-tables2 - self.request 在渲染中

Django-tables2 - self.request in render

我试图根据请求的用户名更改 table 视图,但它一直返回 table 对象没有属性的 AttributeError 'request.' 我直接添加了对 table 的请求(请参阅下面的代码),但仍然无法完成。在我的 table class 中,我重写了 "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 函数

中添加对 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
        )

我发现把 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