variable template tag get_template dirs django decorator

template - Django: Personal Decorador



import django template (3)

Estoy tratando de escribir un decorador "solo para el personal" para Django, pero parece que no consigo que funcione:

def staff_only(error=''Only staff may view this page.''): def _dec(view_func): def _view(request, *args, **kwargs): u = request.user if u.is_authenticated() and u.is_staff: return view_func(request, *args, **kwargs) messages.error(request, error) return HttpResponseRedirect(request.META.get(''HTTP_REFERER'', reverse(''home''))) _view.__name__ = view_func.__name__ _view.__dict__ = view_func.__dict__ _view.__doc__ = view_func.__doc__ return _view return _dec

Tratando de seguir el liderazgo desde aquí . Me estoy poniendo:

''WSGIRequest'' object has no attribute ''__name__''

Pero si saco esas 3 líneas, solo obtengo un inútil "Error interno del servidor". ¿Qué estoy haciendo mal aquí?



Este estilo de función de decorador se usa con un decorador parametrizado, por ejemplo, cuando hace:

@staffonly(my_arguments) def function(request): blah

Si no estás llamando a la función externa, es decir, la estás utilizando así:

@staffonly def function(request):

Obtendrá resultados impares, ya que el objeto de función pasará al incorrecto de las funciones anidadas en el decorador.


Para las Vistas basadas en clase , puede decorar el método de envío de la clase de vista, de la siguiente manera:

from django.contrib.admin.views.decorators import staff_member_required from django.utils.decorators import method_decorator @method_decorator(staff_member_required, name=''dispatch'') class ExampleTemplateView(TemplateView): ...