2017-03-05 9 views
2

내 모델은 ForeignKey으로 구성되어 있으며 generics.DetailView을 사용하여 장고보기에서 개체 세부 정보를 렌더링합니다.템플릿에서 ID 대신 외래 키 유니 코드 값 가져 오기

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 

그리고

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

템플릿을 렌더링 지금에 MyTemplate, 내가 무엇을 얻을 id보다는 __unicode__ 표현입니다. 동일한 문제가 ChoiceField에도 발생합니다 (라벨보다는 가치가 있습니다).

제 질문은 실제 값이 아닌 레이블 또는 유니 코드 표현을 어떻게 얻을 수 있습니까?

답변

0

ForeignKeys의 경우 getattr(self, field.name)이 작동하는 것 같습니다. 그래서 :

ChoiceFields를 들어
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] 

, 레이블 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