2010-11-25 30 views
14

que tienen algo como esto:acceso a los campos de modelo de Django etiqueta y help_text

class ContactData(models.Model): 
    name = models.CharField(max_length=300, verbose_name=u"Name", help_text=u"Please enter your name...",null=True, blank=False) 
    phone = models.CharField(max_length=300, verbose_name=u"Phone number", null=True, blank=False) 

me gustaría mostrar la etiqueta de un campo y help_text en plantilla (es decir - sólo acceder a ella a la vista). ¿Se puede hacer esto?

Respuesta

30
unicode(ContactData._meta.get_field('name').verbose_name) 
unicode(ContactData._meta.get_field('name').help_text) 

unicode(ContactData._meta.get_field('phone').verbose_name) 
unicode(ContactData._meta.get_field('phone').help_text) 
+2

No puede acceder a ninguno de estos campos en una plantilla. –

3

Primero empiece por getting the fields, luego observe los atributos que le interesan.

+3

Esto ** no funciona ** en un _template_ como se solicita en la pregunta. De hecho, uno no puede acceder a un atributo/método de objeto o una clave dict con un nombre que comience con un carácter de subrayado (_) en una plantilla. Debe agregar estos valores al contexto de la vista, que lo poluta y no es muy conveniente. Otro enfoque, no demasiado convincente, pero que polutes el contexto menos se puede encontrar aquí: http://stackoverflow.com/questions/2170228/django-iterate-over-model-instance-field-names-and-values-in- modelo. Básicamente, pones tu objeto en un formulario que te permite hacer lo que se te pidió. – Cans

1

Pruebe esto.

model_instance.name.field.help_text 
+1

Obtengo 'AttributeError: el objeto 'unicode' no tiene atributo 'field'' para' model_instance.name.field' – frnhr

1

Puede mostrar esto de la siguiente manera:

>>> ContactData._meta.fields 
[<django.db.models.fields.AutoField: id>, 
<django.db.models.fields.CharField: name>, 
<django.db.models.fields.CharField: phone>] 
>>> ContactData._meta.fields[1].help_text 
u'Please enter your name...' 
2

Sé que esto es viejo, pero merece una respuesta completa que puede usarse en plantillas.

Si necesita utilizarlo en una plantilla, el método preferido es añadir métodos modelo que obtienen estos valores, tales como:

from django.db import models 
from six import text_type 

class ContactData(models.Model): 
    name = models.CharField(max_length=300, verbose_name=u"Name", help_text=u"Please enter your name...",null=True, blank=False) 
    phone = models.CharField(max_length=300, verbose_name=u"Phone number", null=True, blank=False) 

    def __get_label(self, field): 
     return text_type(self._meta.get_field(field).verbose_name) 

    def __get_help_text(self, field) 
     return text_type(self._meta.get_field(field).help_text) 

    @property 
    def name_label(self): 
     return self.__get_label('name') 

    @property 
    def name_help_text(self): 
     return self.__get_help_text('name') 

    @property 
    def phone_label(self): 
     return self.__get_label('phone') 

    @property 
    def phone_help_text(self): 
     return self.__get_help_text('phone') 

Entonces, digamos instance es su objeto en una plantilla, esta es su etiqueta

<label for="id_phone">{{ instance.phone_label }}</label> 
<div id="id_phone">{{ instance.phone }}</div> 

Como alternativa, puede crear una etiqueta de plantilla para hacer esto, pero el método modelo es más clara y mantiene el modelo autónomo.

0

Ejemplo de una vista:

return render(
    request, 
    'projects/create_edit_project.html', 
    { 
     'form': form, 
     'model_field_meta_data': 
      extract_model_field_meta_data(form), 
    } 
) 

extract_model_field_meta_data extractos help_text para cada campo modelo referenciado por el ModelFormform:

def extract_model_field_meta_data(form): 
    """ Extract meta-data from the data model fields the form is handling. """ 
    meta_data = dict() 
    for field_name, field_data in form.base_fields.items(): 
     meta_data[field_name] = { 
      'help_text': getattr(field_data, 'help_text', '') 
     } 
    return meta_data 

Luego, en la plantilla:

<p class="help-block">{{ model_field_meta_data.title.help_text }}</p> 

title es un campo en el modelo.

Cuestiones relacionadas