2011-04-20 22 views
6

Tengo varios sitios de administración, por lo que diferentes usuarios obtienen una experiencia diferente de editar los objetos en la base de datos. Cada sitio de administración tiene un conjunto diferente de objetos expuestos y un estilo diferente. Todo esto se puede hacer anulando plantillas y objetos ModelAdmin.Cómo anulo help_text en la interfaz de administración de django

No puedo encontrar la forma de proporcionar diferentes help_text a través de los diferentes sitios. help_text siempre se toma directamente de la definición del campo modelo, y no parece haber una manera de anularlo.

¿Me falta algo, o es esto imposible?

Respuesta

0

Siempre se puede cambiar campo de formulario atributos en ModelAdmin constructor, algo así como:

 
    def __init__(self, *args, **kwargs): 
     super(ClassName, self).__init__(*args, **kwargs) 
     if siteA: 
      help_text = "foo" 
     else: 
      help_text = "bar" 
     self.form.fields["field_name"].help_text = help_text 
+0

no funciona como lo que puedo ver - ModelAdmin.fields es sólo una lista de cadenas: http://docs.djangoproject.com /en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fields – Toby

+0

¡Vaya! En realidad, los campos estarán disponibles a través del atributo de formulario de ModelAdmin. Además, asegúrese de que primero se llame al constructor padre. Ver editar. – Carlos

+0

Todavía no funciona para mí: "tipo objeto 'ModelForm' no tiene atributo 'campos'" – Toby

-1

prueba este (puede que tenga que sustituir self.fields con self.form.fields ...)

class PropertyForm(models.ModelAdmin): 
    class Meta: 
     model = Property 
    def __init__(self, *args, **kwargs): 
     super(PropertyForm, self).__init__(*args, **kwargs) 
     for (key, val) in self.fields.iteritems(): 
      self.fields[key].help_text = 'what_u_want' 
1

Cerin tiene razón, pero su código no funciona bien (al menos con Django 1.4).

def get_readonly_fields(self, request, obj): 
    try: 
     field = [f for f in obj._meta.fields if f.name == 'author'] 
     if len(field) > 0: 
      field = field[0] 
      field.help_text = 'some special help text' 
    except: 
     pass 
    return self.readonly_fields 

Tendrá que cambiar "autor" y la cadena de help_text para adaptarse a sus necesidades.

12

Se puede crear un nuevo modelo de formulario y anular la help_text allí:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['myfield'].help_text = 'New help text!' 

a continuación, utilizar la nueva forma en su ModelAdmin:

class MyModel(admin.ModelAdmin): 
    ... 
    form = MyForm 

Ésta es la manera más clara para lograr lo que quiere ¡dado que los campos de formulario pertenecen a las formas de todos modos!

+1

Curiosamente, esto no parece funcionar con los campos 'editable = False'. Estos ni siquiera aparecen en form.fields ... – Cerin

+0

Hola @Cerin, sí, tienes razón, los campos de solo lectura siempre se excluyen de los formularios del modelo de administrador. No son entradas de formulario de solo lectura/deshabilitado o algo así, es solo la versión del campo o método modelo. – ppetrid

4

En Django 1.9, similar a la de abajo funciona para mí

def get_form(self, request, obj=None, **kwargs): 
    form = super(MyAdmin, self).get_form(request, obj, **kwargs) 
    form.base_fields['my_field'].help_text = """ 
    Some helpful text 
    """ 
    return form 
+0

¡Esta es una manera útil y rápida de hacerlo! – ihhcarus

Cuestiones relacionadas