Django:根据用户

时间:2019-01-12 11:08:56

标签: python django permissions django-templates django-views

我想为我的个人项目创建一个学校管理系统。

假设每个学校都有一个管理员。但是有些管理员可以管理多于一所学校,并且他们可以在学校之间切换以管理每所学校。

我想过一种方法,例如使用不同的URL路径。

urlpatterns = [
    url(schools/<int:pk>/, SchoolView.as_view()),
]

有没有办法让我不通过为每个学校使用不同的URL路径来分开?因此,每个管理员都将获得相似的URL路径,但视图将基于Admin呈现或过滤以使用不同的学校。

但是我真的不知道该怎么做?我可以征求意见吗。非常感谢!

1 个答案:

答案 0 :(得分:0)

每个视图函数都接受一个request参数,因此无论您在何处定义视图函数,其外观都可能像这样:

from django.shortcuts import render

def my_view(request):
    #you can check user here with request.user
    #example
    if request.user.is_superuser:
        return render('your_template_for_admin.html', {})
    return render('your_template_for_basic_user.html', {})

编辑::如果您使用的是基于类的视图,则可以像这样覆盖它的 get 方法:

from django.shortcuts import render
from django.views import View

class MyView(View):
    def get(self, request, *args, **kwargs):
        #here you can access the request object
        return render('template.html', {})

基于评论进行编辑:您可以使用get_context_data()代替get(),如@Daniel Roseman在评论中所述。

from django.views import View

class MyView(View):
    def get_context_data(self, **kwargs):
        #example code assuming that we have a relation between schools and admin A
        context = super().get_context_data(**kwargs)
        context['schools'] = School.objects.filter(admin_id=self.request.user__id)
        return context

然后您可以在模板中使用schools查询集。