ModelAdmin levert de hook get_readonly_fields() - het volgende is niet getest, mijn idee is om alle velden te bepalen zoals ModelAdmin dat doet, zonder een recursie tegen te komen met de readonly-velden zelf:
from django.contrib.admin.util import flatten_fieldsets
class ReadOnlyAdmin(ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if self.declared_fieldsets:
fields = flatten_fieldsets(self.declared_fieldsets)
else:
form = self.get_formset(request, obj).form
fields = form.base_fields.keys()
return fields
subclass/mixin deze admin waar het een read-only admin zou moeten zijn.
Voor toevoegen/verwijderen en om hun knoppen te laten verdwijnen, wilt u waarschijnlijk ook toevoegen
def has_add_permission(self, request):
# Nobody is allowed to add
return False
def has_delete_permission(self, request, obj=None):
# Nobody is allowed to delete
return False
P.S .: In ModelAdmin, als has_change_permission (opzoeken of uw overschrijving) False retourneert, komt u niet in de wijzigingsweergave van een object - en de koppeling ernaar zal niet eens worden getoond. Het zou eigenlijk cool zijn als dat zo was, en de standaard get_readonly_fields() controleerde de wijzigingsbevoegdheid en stelde alle velden in dat geval alleen in, zoals hierboven. Op die manier konden niet-changers op zijn minst door de gegevens bladeren ... aangezien de huidige beheerdersstructuur view = edit veronderstelt, zoals het jathanisme opmerkt, zou dit waarschijnlijk de introductie van een "view" permissie bovenop het toevoegen/wijzigen/verwijderen vereisen ...
EDIT: over het instellen van alle velden readonly, ook niet getest maar ziet er veelbelovend uit:
readonly_fields = MyModel._meta.get_all_field_names()
EDIT: Hier is er nog een
if self.declared_fieldsets:
return flatten_fieldsets(self.declared_fieldsets)
else:
return list(set(
[field.name for field in self.opts.local_fields] +
[field.name for field in self.opts.local_many_to_many]
))