2016-01-21 2 views
0

У меня есть очень простое поле выбора в моей модели:get_FOO_display возвращающего пустой строки

MY_TYPES = (
    (1, _("Type 1")), 
    (2, _("Type 2")), 
    (3, _("Type 3")) 
) 
my_field = models.IntegerField(choices=MY_TYPES, default=1) 

_ импортируются как from django.utils.translation import ugettext_lazy as _

Я получаю правильный результат, когда я manage.py shell_plus. Пример:

m = MyModel.objects.get(pk=1) 
m.get_my_field_display() # returns the value correctly 

Однако это возвращение пустой строки в шаблоне: {{ m.get_my_field_display }}

EDIT: Я забыл упомянуть, что я использую values_list() с моей точки зрения: MyModel.objects.values_list('my_field', 'others')

любая помощь ,

+1

Имеет ли 'm' допустимое значение для' my_field'? – Rohan

+1

Что отображается '{{m.my_field}}' в шаблоне? Используя созданные имена переменных, вы можете скрыть проблему. – Alasdair

+0

'm.my_field' возвращает правильное значение Integer. Я просто заметил, что я использую values_list(), возможно, проблема. Я уточню свой вопрос. – Ali

ответ

1

Чтобы использовать методы модели, ваш запрос должен возвращать модели, а не простые значения. Я предлагаю вам изменить свой запрос:

MyModel.objects.only('my_field', 'others') 

Так что вы оба выбрать только те поля, которые нужно из базы данных и по-прежнему в состоянии использовать методы модели. More on only in the docs.

+0

спасибо Алекс, работает безупречно. – Ali

0

Точка values_list заключается в том, что, как следует из названия, она возвращает список значений, а не экземпляры модели. Поэтому вы не можете использовать какие-либо методы модели.

Если у вас нет веской причины, вы всегда должны передавать фактические модели в свой шаблон; он позволяет хранить столько логики, сколько вам нужно в классах моделей, и вызывать эти методы непосредственно из шаблона.

+0

спасибо за ответ Daniel. Я использую values_list, потому что у модели много полей, и мне нужно всего около 8 из них для этого представления. Я посмотрю, что я могу сделать, используя values_list или что-то в этом роде. – Ali

+1

Как предполагает Алекс, вы можете использовать 'only', который возвращает фактический объект модели, но не заполняет все поля. –

+0

haha ​​Мне пришлось прочитать ваш комментарий, чтобы увидеть его: P. Большое спасибо! – Ali