2012-04-11 1 views
0

я сделал шаблон, чтобы показать все поля и значение из модели, это выглядит следующим образом:Джанго DetailView Шаблон шоу get_FIELDNAME_display() значения всех полей

## detail_template.html ## 
<html> 
<body> 
{% for name, value in object.get_fields %} 
    <p> 
     <label>{% trans name %}:</label> 
     <span>{{ value|default:"Not available" }}</span> 
    </p> 
{% endfor %} 
</body> 
<html> 

В классе вы можете увидеть поле и функции объявлены:

## models.py ## 
Class Object: 
    GENDER_CHOICES = (
     ('M', 'Male'), 
     ('F', 'Female'), 
    )  

    name = models.CharField(verbose_name=u"Full name", max_length=200, blank=True, null=True) 
    sex = models.CharField(verbose_name=u"Sex", max_length=1, choices=GENDER_CHOICES) 
    birthdate = models.DateField(verbose_name=u"Birth date", help_text="Format: DD/MM/AAAA", blank=True, null=True) 
    status = models.IntegerField(verbose_name=u"Status", db_index=True, default=1) 
    #...tons of other fields... 

    def get_status_display(self): 
     if self.status == 1: 
      return "Active" 
     else if self.status == 0: 
      return "Inactive" 
     else: 
      return "Dead" 

    def get_birthdate_display(self): 
     return self.birthdate.strftime("%d/%m/%Y") 

    def get_fields(self): 
     return [(field.verbose_name, self._get_FIELD_display(field)) for field in self.__class__._meta.fields] 

* Что уже показывает это:
Полное имя: Не доступно (потому что я оставил это поле пустым)
Пол: Мужской (вместо М)Дата рождения: 10 апреля 2012 (НЕ в формате возвращенного get_birthdate_display)
Статус: 3 (не возвращаемая строка в get_status_display)


* То, что я хочу, чтобы отобразить это:
Полное имя: Нет в наличии (потому что я оставил это поле пустым)
Пол: Мужской (вместо M) дата
рождения: 20/10/1952 (с форматом в get_birthdate_display)
Статус: Dead (строка, возвращенная в get_status_display)


Так что я хочу, чтобы получить get_FIELDNAME_display, когда есть один, не делая вручную что-то вроде:

<p> 
    <label>{% trans 'Full name' %}:</label> 
    <span>{{ object.name|default:"Not available" }}</span> 
</p>  
<p> 
    <label>{% trans 'Sex' %}:</label> 
    <span>{{ object.get_sex_display|default:"Not available" }}</span> 
</p> 
<p> 
    <label>{% trans 'Birth Date' %}:</label> 
    <span>{{ object.get_birthdate_display|default:"Not available" }}</span> 
</p> 
<p> 
    <label>{% trans 'Status' %}:</label> 
    <span>{{ object.get_status_display|default:"Not available" }}</span> 
</p> 

Я признателен за любую помощь! Tks

ответ

0

Не особенно красивая, но вы можете изменить метод get_fields в вашей модели что-то вроде:

def get_fields(self): 
    pairs = [] 
    for field in self._meta.fields: 
     name = field.name 
     try: 
      pairs.append((name, getattr(self, "get_%s_display" % name)())) 
     except AttributeError: 
      pairs.append((name, getattr(self, name))) 
    return pairs 
+0

Добавлено '()' после 'GetAttr (само "get_% s_display" имя%)'. Думайте, что вам нужны эти, но я не проверял это. – dgel