access django model fields label and help_text

后端 未结 6 1611
面向向阳花
面向向阳花 2020-12-15 04:19

I have something like this:

class ContactData(models.Model):
    name  = models.CharField(max_length=300, verbose_name=u\"Name\", help_text=u\"Please enter y         


        
相关标签:
6条回答
  • 2020-12-15 04:41
    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)
    
    0 讨论(0)
  • 2020-12-15 04:43

    django-etc application has model_field_verbose_name and model_field_help_text template tags to access the data you asked from templates: http://django-etc.rtfd.org/en/latest/models.html#model-field-template-tags

    0 讨论(0)
  • 2020-12-15 04:44

    You can show this as follows:

    >>> 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...'
    
    0 讨论(0)
  • 2020-12-15 04:57

    Try this.

    model_instance.name.field.help_text
    
    0 讨论(0)
  • 2020-12-15 05:00

    I know this is old, but it deserves a full answer that can be used in templates.

    If you need to use it in a template, the preferred method is to add model methods that get these values, such as:

    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')
    

    Then, let us say instance is your object in a template, this is your label

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

    Alternatively, you could create a template tag to do this, but the model method is clearer and keeps the model self contained.

    0 讨论(0)
  • 2020-12-15 05:03

    Example from a view:

    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 extracts help_text for each model field referenced by the ModelForm form:

    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
    

    Then in the template:

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

    title is a field in the model.

    0 讨论(0)
提交回复
热议问题