LoginRequiredMixin和get_queryset with django-tables2

时间:2016-08-13 12:18:09

标签: python django python-3.x django-views django-tables2

我已经有一个基于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(以便用户只能看到他们应该看到的汽车)?谁能帮忙。非常感谢您的帮助!

2 个答案:

答案 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})