2010-11-25 13 views
14

Ich habe so etwas wie dies:Zugang django Modellfelder Label und 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) 

Ich möchte ein Feld Label und help_text in Vorlage zeigen (das ist - es ist nur aus Sicht zugreifen). Kann dies getan werden?

Antwort

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

Sie können nicht auf eines dieser Felder in einer Vorlage zugreifen. –

3

Beginnen Sie zuerst mit getting the fields, dann sehen Sie sich die Attribute an, die Ihnen wichtig sind.

+3

Dieses ** funktioniert nicht ** in einem _template_ wie in der Frage angefordert. Tatsächlich kann nicht auf ein Objektattribut/eine Objektmethode oder einen dict-Schlüssel mit einem Namen zugegriffen werden, der mit einem Unterstrich (_) in einer Vorlage beginnt. Sie müssen diese Werte zum Ansichtskontext hinzufügen, der sie stört und nicht sehr praktisch ist. Ein anderer Ansatz, nicht sehr praktisch, aber das poltert den Kontext weniger finden Sie hier: http://stackoverflow.com/questions/2170228/django-iterate-over-model-instance-field-names-and-values-in-in- Vorlage. Im Grunde haben Sie Ihr Objekt in eine Form gebracht, in der Sie tun können, was Sie gefragt haben. – Cans

1

Versuchen Sie es.

model_instance.name.field.help_text 
+1

Ich bekomme 'AttributeError: 'Unicode' Objekt hat kein Attribut 'Feld' für' model_instance.name.field' – frnhr

1

Sie können dies wie folgt: Fig

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

Ich weiß, das ist alt, aber es verdient eine vollständige Antwort, die in Vorlagen verwendet werden kann.

Wenn Sie es in einer Vorlage verwenden müssen, die bevorzugte Methode Modell Methoden hinzuzufügen ist, die diese Werte zu erhalten, wie zum Beispiel:

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

Dann lassen Sie uns sagen, instance ist Ihr Objekt in einer Vorlage, das ist dein Label

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

Alternativ können Sie einen Template-Tag, dies zu tun schaffen könnten, aber das Modell Methode ist klarer und hält das Modell eigenständig.

0

Beispiel aus einer Ansicht:

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 Extrakte help_text für jedes Modellfeld durch die ModelFormform referenzierten:

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 

dann in der Vorlage:

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

title ist ein Feld im Modell.

Verwandte Themen