我已经有一个基于Django的通用ListView类的工作表。但我错过了排序的能力,因此我看了一下使用django-tables2生成一个新表。这很容易设置,但我不知道如何从我的旧ListView类实现两个重要的功能; 1)页面仅对登录用户可见,2)基于用户过滤对象。
以下是views.py
中的旧课程:
class CarList(LoginRequiredMixin, ListView):
model = Car
paginate_by = 20
def get_queryset(self):
qs = super().get_queryset()
return qs if self.request.user.is_staff else qs.filter(bureau=self.request.user.bureau, active = 1)
以下是views.py
中新的django-tables2函数:
def car(request):
table = CarTable(Car.objects.all())
RequestConfig(request, paginate={'per_page': 25}).configure(table)
return render(request, 'car.html', {'table': table})
和新tables.py
:
import django_tables2 as tables
from app.models import Feriehus
from django.contrib.auth.mixins import LoginRequiredMixin
class CarTable(tables.Table):
class Meta:
model = Car
attrs = {'class': 'paleblue'}
fields = ('car_id', 'type', 'price', 'year',)
如何使用django-tables2实现LoginRequiredMixin(以便列表页面仅对登录用户可见)和我的旧get_queryset(以便用户只能看到他们应该看到的汽车)?谁能帮忙。非常感谢您的帮助!
答案 0 :(得分:1)
要管理查看页面的权限,您仍然可以使用login_required装饰器来处理基于函数的视图。
from django.contrib.auth.decorators import login_required
@login_required
def car(request):
table = CarTable(Car.objects.all())
RequestConfig(request, paginate={'per_page': 25}).configure(table)
return render(request, 'car.html', {'table': table})
初始化CarTable时应该放置正确的过滤查询集。
答案 1 :(得分:0)
对于过滤对象,您可以将过滤后的 QuerySet 传递给表而不是 all
。
def car(request):
cars = Car.objects.all()
# filter the objects
if not request.user.is_staff:
cars = cars.filter(bureau=request.user.bureau, active = 1)
table = CarTable(cars)
RequestConfig(request, paginate={'per_page': 25}).configure(table)
return render(request, 'car.html', {'table': table})