2017-03-05 46 views
2

我的模型由ForeignKey組成,我使用generics.DetailView在django視圖中呈現對象細節。在模板中獲取外鍵unicode值而不是其編號

爲MyModel

class MyModel(models.Model): 
    myField = models.ForeignKey(...) 

    def get_fields(self): 
     # called by the template 
     return [(field.verbose_name, field.value_to_string(self)) for field in type(self)._meta.fields] 

MyView的

class Detail(DetailView): 
    model = MyModel 
    template_name = 'path/to/template.html' 

    def get_context_data(self, **kwargs): 
     context = super(Detail, self).get_context_data(**kwargs) 
     # do something 
     return context 

而且MyTemplate的

{% for field, value in object.get_fields %} 
      <tr> 
       <th>{{ field }}</th> 
       <td>{{ value }}</td> 
      </tr> 
{% endfor %} 

現在,當模板呈現,我得到的是id而非__unicode__表示。 ChoiceField也出現同樣的問題(我得到的是價值而不是其標籤)。

所以我的問題是,我如何獲得標籤或unicode表示而不是他們的實際值?

回答

0

對於ForeignKeys,getattr(self, field.name)似乎正在工作。所以:

class MyModel(models.Model): 
    myField = models.ForeignKey(...) 

    def get_fields(self): 
     # called by the template 
     return [(field.verbose_name, unicode(getattr(self, field.name))) for field in type(self)._meta.fields] 

對於ChoiceFields,標籤可以檢索爲self.get_<field_name>_display()。所以,一起,也許有點像

class MyModel(models.Model): 
    myField = models.ForeignKey(...) 

    def get_field_value(self, field): 
     if isinstance(field, models.CharField) and field.choices: 
      return getattr(self, 'get_{}_display'.format(field.name))() 
     return unicode(getattr(self, field.name)) 

    def get_fields(self): 
     # called by the template 
     return [(field.verbose_name, self.get_field_value(field)) for field in type(self)._meta.fields] 
+0

謝謝你殿下。 – AnnShress