Django: поле объекта / выбора DeferredAttribute как строковое значение для изменения контекста в ListView на основе классов - PullRequest
0 голосов
/ 03 июля 2019

В моем шаблоне я хотел бы отобразить длинное имя, однако я не сохраняю полное имя в базе данных, только ссылочный номер.

Моя попытка решить проблему - преобразовать кортеж Choices в словарь

prd_dic = dict(PRODUCTS)

Затем я называю Значение в словаре Ключом

name = prd_dic['0000']

В моем представлении списка я изменяю контекст для подачи полного имени в шаблон

context['product_name'] = name

Когда я передаю объект в место, где ожидается строка, возникает KeyError (с использованием объекта DeferredAttribute).

У меня вопрос: есть ли встроенная функция, которую нужно решить выше, либо в представлении, как функции для преобразования и подачи в контекст, либо как непосредственное преобразование в модели?

Идея состоит в том, чтобы преобразовать сохраненное число в полное имя в соответствии с таблицей ключей для отображения в шаблоне.

Благодарен за некоторый вклад.

PRODUCTS = (
    ('0000'   ,   'Hamburger'),
    ('1111'   ,   'Pizza')
)

class Product(models.Model):
    product_number = models.CharField(max_length=20,choices=PRODUCTS, blank=True, null=True)

class ProductListView(ListView):
    model = Product
    template_name = 'product/product_list.html'

    def get_context_data(self, **kwargs):
        context = super(ProductListView, self).get_context_data(**kwargs)
        prd_obj = Product.product_number # this is an object
        prd_dic = dict(PRODUCTS)
        name = prd_dic[prd_obj] # a single string, prd_dic['0000'] works in template
        context['product_name'] = name
        return context

1 Ответ

1 голос
/ 03 июля 2019

Метод get_product_number_display автоматически определяется для вас;Вы можете вызвать его прямо из шаблона, без необходимости переопределять get_context_data.

См. документы по get_FOO_display.

...