Django 指定用户角色时呈现或重定向

Django 指定用户角色时呈现或重定向,django,django-views,django-permissions,Django,Django Views,Django Permissions,我正在使用django构建应用程序(请注意,我对django非常陌生)。我想从此现有视图添加重定向 视图中的对象: from core.views import generic class ListViewPublic(generic.ListView): pass class BookListView(ListViewPublic): model = Book def get_queryset(self): filter_kwargs = {

我正在使用django构建应用程序(请注意,我对django非常陌生)。我想从此现有视图添加重定向

视图中的对象:

from core.views import generic

class ListViewPublic(generic.ListView):
    pass

class BookListView(ListViewPublic):
    model = Book

    def get_queryset(self):
        filter_kwargs = {
            'status': Book.STATUS.public,
        }
        return Book.objects.filter(**filter_kwargs)

    def get_context_data(self, **kwargs):
        context = super(BookListView, self).get_context_data(**kwargs)
        form = SearchForm(load_all=True)
        context.update({'form': form})
        return context
e、 g

  • 如果用户未登录,则应显示该页面
  • 如果用户的角色为阅读器,则应呈现页面
  • 如果用户的角色是作者,则应将其重定向到url
如何实现这种行为?

您可以使用decorator。为了满足您的定制需求,比如它应该重定向到/author,您必须创建定制装饰器。像这样的

from django.utils.decorators import method_decorator
from django.template import RequestContext, Context
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, redirect, render

def custom_login_required(f):

    def wrap(request, *args, **kwargs):
        """
           this will check user is logged in , if not it will redirect to login page
        """
        if request.user.is_authenticated() and request.user.user_profile.role=='author':
            return HttpResponseRedirect('/author')
        else:
            return render_to_response('index.html', locals(), context_instance=RequestContext(request))
        return f(request, *args, **kwargs)

    wrap.__doc__ = f.__doc__
    wrap.__name__ = f.__name__
    return wrap
@method_decorator(custom_login_required)
def get_context_data(self, **kwargs):
        context = super(BookListView, self).get_context_data(**kwargs)
        form = SearchForm(load_all=True)
        context.update({'form': form})
        return context
上面写着,获取上下文数据,比如这样

from django.utils.decorators import method_decorator
from django.template import RequestContext, Context
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, redirect, render

def custom_login_required(f):

    def wrap(request, *args, **kwargs):
        """
           this will check user is logged in , if not it will redirect to login page
        """
        if request.user.is_authenticated() and request.user.user_profile.role=='author':
            return HttpResponseRedirect('/author')
        else:
            return render_to_response('index.html', locals(), context_instance=RequestContext(request))
        return f(request, *args, **kwargs)

    wrap.__doc__ = f.__doc__
    wrap.__name__ = f.__name__
    return wrap
@method_decorator(custom_login_required)
def get_context_data(self, **kwargs):
        context = super(BookListView, self).get_context_data(**kwargs)
        form = SearchForm(load_all=True)
        context.update({'form': form})
        return context

嗨@Pawan谢谢你的访问和回答。我在文件顶部添加了
custom\u login\u required
,然后将
@method\u decorator
放在
get\u context\u data
上方,但我得到了错误
wrap()至少接受一个参数(给定0)
。有线索吗?