2011-02-23 36 views
5

estoy usando el sitio de administración de Django con algunos campos de solo lectura en los registros:administrador de Django: ocultar los campos de solo lectura en los registros nuevos?

class BookAdmin(admin.ModelAdmin): 
    fieldsets = [ 
    (None, {'fields': ['title', 'library_id', 'is_missing', \ 
         'transactions_all_time']}), 
    ] 
    readonly_fields = ['transactions_all_time',] 
    list_display = ('library_id', 'author', 'title') 

Esto funciona muy bien durante la edición de registros - transactions_all_time el campo es de sólo lectura, así como yo quiero.

Sin embargo, cuando se agregan nuevos registros se comporta de forma un tanto extraña. Aparece una sección de solo lectura en la parte inferior de la página, que no puedo editar y que es irrelevante en este momento.

Sería mucho mejor si este campo no estuviera presente al agregar nuevos registros.

¿Existe alguna opción de Django para no mostrar campos de solo lectura al agregar un nuevo registro? Sé que puedo hackear el CSS en add_form.html para ocultarlo, pero ¿hay una manera mejor?

Gracias.

Respuesta

0

Otra alternativa es configurar el editable arg en el Modelo original.

class Book(models.Model): 
    transactions_all_time = models.BooleanField(editable=False) 

su ModelAdmin no mostrará el campo en edición, el campo será excluido.

+0

Quiere que el campo sea de solo lectura en el formulario de edición, sin embargo, no lo excluya por completo. –

+0

Es la vista de agregar que me importa, no la vista editable. – AP257

13

Tuve un problema similar. Lo resolvió así

class MyModelAdmin(admin.ModelAdmin): 
    readonly_fields = ('field_one',) 
    def get_readonly_fields(self, request, obj=None): 
     if obj: # Editing 
      return self.readonly_fields 
     return() 
1

Tuve un problema similar con una solución ligeramente diferente. Quería ocultar vistas previas de imágenes (sólo lectura campos) de la 'nueva' forma ('agregar' Vista), pero mostrarlos al recoger un nuevo objeto:

class PhotoAdmin(admin.ModelAdmin): 
readonly_fields = ('admin_image', 'admin_thumb',) 
search_fields = ('filename', 'user', 'supplier', 'customer') 
list_display= ('admin_thumb','filename', 'user', 'supplier', 'customer') 
#fields = ('admin_thumb', 'admin_image', 'original_image', 'user', 'supplier', 'customer') 


def get_fieldsets(self, request, obj=None): 
    fieldset_existing = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('admin_thumb', 'admin_image', 
       'original_image', 'user', 'supplier', 'customer', 'priority',)} 
     ), 
    ) 
    fieldset_new = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('original_image', 'user', 'supplier', 'customer', 'priority',)} 
     ), 
    ) 
    if obj: # Editing 
     return fieldset_existing 
    return fieldset_new 

La línea #fields muestra los campos originales. Admito que esta solución no es muy 'SECA', pero es clara y simple.

3

Aquí hay una versión seca de la solución de Kushal:

def get_fieldsets(self, request, obj=None): 
    def if_editing(*args): 
     return args if obj else() 
    return (
     (None, { 
      'classes': ('wide',), 
      'fields': if_editing('admin_thumb', 'admin_image',) + 
         ('original_image', 'user', 'supplier', 'customer', 'priority',)} 
     ), 
    ) 

Tenga en cuenta que esto sólo funciona en la forma principal - en un formulario en línea, que están pasaron el obj principal, no el obj en línea.

Cuestiones relacionadas