You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在django-tables2的Table类中获取django-filters搜索关键词

解决方法

方法一:通过视图传递搜索关键词到Table类

1. 修改视图类

重写SingleTableMixin的get_table方法,从请求中提取搜索关键词并传递给Table实例:

class CommentsView(LoginRequiredMixin, SingleTableMixin, FilterView):
    model = Comments
    queryset = Comments.objects.all().order_by('-id')
    table_class = CommentTable
    filterset_class = CommentFilter

    def get_table(self, **kwargs):
        table = super().get_table(**kwargs)
        # 从请求GET参数中拿到搜索关键词,默认空字符串
        table.search_key = self.request.GET.get('comment', '')
        return table

2. 修改Table类

在render_comment方法中直接访问已传递的关键词:

from django.utils.html import escape, mark_safe

class CommentTable(tables.Table):   
    def render_comment(self, record):
        # 获取传递过来的搜索关键词
        search_key = self.search_key
        # 先转义内容和关键词,避免XSS风险
        safe_comment = escape(record.comment)
        safe_search_key = escape(search_key)
        
        # 如果有关键词,高亮匹配内容
        if safe_search_key:
            safe_comment = safe_comment.replace(safe_search_key, f'<span style="color:red">{safe_search_key}</span>')
        
        return mark_safe(safe_comment)

方法二:通过Filter将关键词存入请求对象

1. 修改Filter类

在qs属性中将搜索关键词存入请求的自定义属性:

class CommentFilter(FilterSet):
    class Meta:
        model = Comments
        fields = ['comment']

    @property
    def qs(self):
        parent = super().qs
        search_key = self.data.get('comment', '')
        # 把关键词存入请求对象的自定义属性
        self.request.search_key = search_key
        return parent

2. 修改视图类

重写get_table方法,将request对象传递给Table实例:

class CommentsView(LoginRequiredMixin, SingleTableMixin, FilterView):
    model = Comments
    queryset = Comments.objects.all().order_by('-id')
    table_class = CommentTable
    filterset_class = CommentFilter

    def get_table(self, **kwargs):
        table = super().get_table(**kwargs)
        table.request = self.request
        return table

3. 修改Table类

在render_comment方法中从request对象提取关键词:

from django.utils.html import escape, mark_safe

class CommentTable(tables.Table):   
    def render_comment(self, record):
        # 从request对象中获取关键词,默认空字符串
        search_key = getattr(self.request, 'search_key', '')
        safe_comment = escape(record.comment)
        safe_search_key = escape(search_key)
        
        if safe_search_key:
            safe_comment = safe_comment.replace(safe_search_key, f'<span style="color:red">{safe_search_key}</span>')
        
        return mark_safe(safe_comment)

内容的提问来源于stack exchange,提问作者Little Elite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:20:06