tutorial startapp sqlmigrate setup manage createsuperuser python django django-admin

python - startapp - Django admin-hace que todos los campos sean de solo lectura



python manage.py startapp (8)

Estoy tratando de hacer que todos los campos sean de solo lectura sin enumerarlos explícitamente.

Algo como:

class CustomAdmin(admin.ModelAdmin): def get_readonly_fields(self, request, obj=None): if request.user.is_superuser: return self.readonly_fields return self.fields

El problema es que CustomAdmin.fields no está configurado en este punto.

¿Algunas ideas?


Con get_fieldsets obtienes todos los campos del formulario

def get_readonly_fields(self, request, obj=None): readonly = [] for fs in self.get_fieldsets(request, obj): if len(fs) > 1: readonly += fs[1].get(''fields'', []) return readonly


Cuidado, self.model._meta.fields no son necesariamente los mismos campos que CustomAdmin tiene!

"Todos los campos del administrador" se verían más así:

from django.contrib import admin from django.contrib.admin.utils import flatten_fieldsets class CustomAdmin(admin.ModelAdmin): def get_readonly_fields(self, request, obj=None): if request.user.is_superuser: return self.readonly_fields 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] ))


Esto me funcionó con Django 1.10.

def get_readonly_fields(self, request, obj=None): if request.user.is_superuser: return self.readonly_fields return list(set( [field.name for field in self.opts.local_fields] + [field.name for field in self.opts.local_many_to_many] ))


Mi requerimiento era similar. Solo necesitaba que un campo se mostrara como de solo lectura. Y esto funcionó bien:

class ChoiceInline(admin.TabularInline): model = Choice extra = 1 fields = [''choice_text'', ''votes''] readonly_fields = [''votes''] class QuestionAdmin(admin.ModelAdmin): #fields = [''pub_date'', ''question_text''] fieldsets = [ (None, {''fields'': [''question_text'']}), (''Date Information'', {''fields'': [''pub_date'']}), ] search_fields = [''question_text''] inlines = [ChoiceInline]

Consulte : C: / Python27 / Lib / site-packages / django / contrib / admin / options.py


Ok, ahora hay esto:

class CustomAdmin(admin.ModelAdmin): def get_readonly_fields(self, request, obj=None): # ... return [f.name for f in self.model._meta.fields]

Sigo buscando un camino menos feo.


Para Inlines (Tab o Stack)

def get_readonly_fields(self, request, obj=None): fields = [] for field in self.model._meta.get_all_field_names(): if field != ''id'': fields.append(field) return fields def has_add_permission(self, request): return False


Podrías recorrer los meta campos del modelo:

def get_readonly_fields(self, request, obj=None): if obj: self.readonly_fields = [field.name for field in obj.__class__._meta.fields] return self.readonly_fields


puedes hacer esto

class CustomAdmin(admin.ModelAdmin): def has_change_permission(self, request, obj=None): return False