2015-08-12 2 views
2

Я создаю приложение, используя 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 

например,

  • Данный пользователь не вошел в систему, он должен быть отобразить страницу
  • Данный пользователь имеет читателя как его роль, она должна быть отобразить страницу
  • Данный пользователь имеет автор как его роль , следует перенаправить на /author URL

Как я могу добиться такого поведения?

ответ

1

вы можете использовать login_required декоратор. Для ваших пользовательских потребностей, таких как перенаправление на/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 

и напишите выше get_context_data что-то вроде этого.

@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 
+0

hi @Pawan Спасибо за ваше посещение и ваш ответ. Я добавил 'custom_login_required' в верхней части файла, а затем поставил' @ method_decorator' над 'get_context_data', но я получил ошибку' wrap() принимает не менее 1 аргумент (0 задано) '. Есть ли ключ к этому? – Ardian

Смежные вопросы