如何在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
相关产品推荐
相关产品推荐

