【问题标题】:Django-tables2 - self.request in renderDjango-tables2 - 渲染中的 self.request
【发布时间】:2020-01-22 05:21:09
【问题描述】:

我正在尝试根据请求的用户名更改表格视图,但它不断返回 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
        )

【问题讨论】:

    标签: django django-tables2


    【解决方案1】:

    我发现将 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,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(), request=self.request, **kwargs)
        table.request = self.request
        return RequestConfig(
            self.request, paginate=self.get_table_pagination(table)
        ).configure(table)
    

    并从您的 Tables init 方法中获取请求对象,例如:

    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
    

    【讨论】:

    • 谢谢,维克多。但是,即使进行了您提到的更改,它仍然会在表渲染中返回 self.request 的 AttributeError 。你有什么想法...?
    • @YoobinJeon 我已经用解决方案更新了我的答案
    • 维克托,它就像一个魅力。你拯救了我的一天。谢谢!
    猜你喜欢
    • 2018-10-20
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多