Tengo un panel para administrar las publicaciones del administrador o los usuarios que son administradores. ¿Cómo puedo restringir el panel y mostrarlo solo para administradores, no para otros usuarios que se registran en el sistema?

Vista:

class IndexView(LoginRequiredMixin, ListView):
    model = Post
    template_name = 'panel/index.html'

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context["posts"] = Post.objects.all()
        context["counter"] = self.post_counter(context["posts"])
        return context

    def post_counter(self, posts):
        postNumber = 0
        for post in posts:
            postNumber +=1

        return postNumber
1
The Mir 17 sep. 2018 a las 00:03

3 respuestas

La mejor respuesta

Como tiene CBV, puede usar PermissionMixin y luego especificar el permiso. Algo como esto :

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin, View):
   permission_required = ("is_staff", "is_superuser", )
   ....

Referencia: https: // docs .djangoproject.com / es / 2.1 / topics / auth / default / # django.contrib.auth.mixins.PermissionRequiredMixin

Si desea tener una vista basada en funciones, puede usar @staff_member_required

Algo como esto :

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def my_view(request):
   ...

Referencia y lectura adicional: https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.views.decorators.staff_member_required

1
Umair Mohammad 16 sep. 2018 a las 21:26

En la plantilla, puede hacerlo marcando directamente al usuario

{% if user.is_superuser %}
    <p>I'm an admin.</p>
{% else %}
    <p>I'm an user.</p>
{% endif %}
0
Karim N Gorjux 17 sep. 2018 a las 00:13

Puede crear el mixin de la vista que requiere que el usuario sea administrador:

class AdminRequiredMixin:
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_staff:
            return redirect(WHERE_YOU_WANT)
        return super().dispatch(request, *args, **kwargs)
1
Lev Zakharov 16 sep. 2018 a las 21:16