Domanda Django is_staff decoratore di permessi


Sto cercando di limitare l'accesso alle pagine utilizzando 2 livelli utente. Superuser e admin. Super utente è un utente regolare di Django con "is_superuser" assegnato. L'utente amministratore è anche un utente normale con solo il permesso 'is_staff' assegnato.

Il problema è che quando uso questo decoratore per un utente amministratore, non supera il test:

@permission_required('is_staff')
def my_view(....)

@permission_required('is_staff') restituisce false per utenti anonimi. (corretta)
@permission_required('is_superuser') restituisce solo true per i superutenti (corretto)
@permission_required('is_staff') restituisce FALSE per gli utenti con il permesso 'is_staff' assegnato. (sbagliato).

qualche idea?


44
2018-04-29 14:10


origine


risposte:


is_staff non è un permesso così invece di permission_required potresti usare:

@user_passes_test(lambda u: u.is_staff)

o

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

@staff_member_required

93
2018-04-29 14:18



per le viste basate sulla classe è possibile aggiungere permission_required('is_staff') al urls.py:

from django.contrib.auth.decorators import permission_required

url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),

9
2018-06-24 11:02



Per le viste basate su classi, il UserPassesTestMixin è conveniente, ad es.

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...

1
2018-04-18 13:44