Przypuszczam, że pierwszym pytaniem, które musisz zadać, jest to, jakie uprawnienia potrzebujesz i jakiego rodzaju. Jakiego rodzaju, mam na myśli, czy chcesz na poziomie modelu czy obiektu. Aby wyjaśnić różnicę, powiedz, że masz model samochodu. Jeśli chcesz nadać uprawnienia do wszystkich samochodów, wybierz poziom modelu, ale jeśli chcesz nadać uprawnienia na podstawie samochodu, wybierz opcję Poziom obiektu. Możesz potrzebować obu, a to nie jest problem, jak zobaczymy.
Jeśli chodzi o uprawnienia modelu, Django obsługuje je za Ciebie ... głównie. Dla każdego modelu Django utworzy uprawnienia w postaci „nazwa aplikacji.permissionname_modelname”. Jeśli masz aplikację o nazwie „drivers” z modelem samochodu, jednym uprawnieniem będzie „drivers.delete_car”. Uprawnienia, które Django automatycznie utworzy, zostaną utworzone, zmienione i usunięte. Z jakiegoś dziwnego powodu zdecydowali się nie włączać uprawnień do odczytu z CRUD, będziesz musiał to zrobić sam. Zwróć uwagę, że Django zdecydował się z jakiegoś powodu zmienić „update” CRUD na „zmienić”. Aby dodać więcej uprawnień do modelu, powiedzmy uprawnienia do odczytu, użyj klasy Meta:
class Car( models.Model ):
class Meta:
permissions = (
( "read_car", "Can read Car" ),
)
Zwróć uwagę, że uprawnienia to zestaw krotek, gdzie elementy krotki to uprawnienia opisane powyżej i opis tego uprawnienia. Nie musisz przestrzegać konwencji permname_modelname, ale zwykle się jej trzymam.
Wreszcie, aby sprawdzić uprawnienia, możesz użyć has_perm:
obj.has_perm( 'drivers.read_car' )
Gdzie obj jest instancją użytkownika lub grupy. Myślę, że prostsze jest napisanie funkcji do tego:
def has_model_permissions( entity, model, perms, app ):
for p in perms:
if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
return False
return True
Gdzie obiekt jest obiektem do sprawdzenia uprawnień (Grupa lub Użytkownik), model jest instancją modelu, uprawnienia to lista uprawnień w postaci ciągów do sprawdzenia (np. [„Odczyt”, „zmiana”]), a aplikacja jest nazwa aplikacji jako ciąg. Aby wykonać to samo sprawdzenie co has_perm powyżej, wywołałbyś coś takiego:
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
Jeśli potrzebujesz uprawnień do obiektów lub wierszy (mają one na myśli to samo), to Django samo z siebie nie może ci pomóc. Fajną rzeczą jest to, że możesz używać jednocześnie uprawnień do modelu i do obiektów. Jeśli chcesz mieć uprawnienia do obiektów, musisz albo napisać własne (jeśli używasz 1.2+), albo znaleźć projekt napisany przez kogoś innego, jedno, które lubię, to django-objectpermissions from washingtontimes.