如何通过Django-tables2实现用户专属数据表格展示?
解决Django-tables2仅显示当前用户数据的问题
好的,我来帮你搞定这个需求——要让用Django-tables2渲染的表格只展示当前登录用户创建的数据,你只需要在获取基础查询集(queryset)的环节加入用户过滤逻辑就行,下面是两种实用的实现方式:
方式1:修改基类PagedFilteredTableView(全局生效)
如果你希望所有继承这个基类的视图都自动过滤当前用户的数据,可以直接修改Utils.py里的get_queryset方法,先把初始查询集限定为当前用户的数据,再应用过滤器:
# Utils.py from django_tables2 import SingleTableView from django_tables2.config import RequestConfig class PagedFilteredTableView(SingleTableView): filter_class = None formhelper_class = None context_filter_name = 'filter' def get_queryset(self, **kwargs): # 先过滤出当前登录用户的数据,再调用父类方法 qs = super().get_queryset().filter(user=self.request.user) # 原有过滤器逻辑保持不变 self.filter = self.filter_class(self.request.GET, queryset=qs) self.filter.form.helper = self.formhelper_class() return self.filter.qs def get_context_data(self, **kwargs): context = super().get_context_data() context[self.context_filter_name] = self.filter return context
方式2:在AList视图中单独重写(单个视图定制)
如果不想修改基类影响其他视图,也可以直接在Views.py的AList类里重写get_queryset方法,只给这个视图添加用户过滤:
# Views.py from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator # 可选:添加登录验证,确保只有登录用户能访问 @method_decorator(login_required, name='dispatch') class AList(PagedFilteredTableView): model = A template_name = "m/see.html" table_class = ATable filter_class = AFilter formhelper_class = AListFormHelper def get_queryset(self): # 先获取当前用户的数据集,再交给父类处理过滤和分页 qs = super().get_queryset().filter(user=self.request.user) return qs
原理说明
你之前用函数视图时,通过A.objects.filter(user=request.user)直接拿到了当前用户的数据;现在在类视图里,我们只需要把这个过滤逻辑提前到初始查询集的获取阶段,后续的过滤器、表格分页等功能都会基于这个已过滤的数据集工作,自然就不会显示其他用户的数据了。
另外建议给视图加上登录验证(比如上面的@method_decorator(login_required)),避免匿名用户访问时出现request.user为空的错误。
内容的提问来源于stack exchange,提问作者ritu
相关产品推荐
相关产品推荐

