Django:DeferredAttribute 对象/选择字段作为字符串值修改基于 class 的 ListView 中的上下文

Django: DeferredAttribute object / choices field as string value to modify Context in class based ListView

在我的模板中,我想显示一个长名称,但是,我没有在数据库中保存全名,只保存了一个参考编号。

我尝试的解决方案是将 Choices 元组转换为字典

prd_dic = dict(PRODUCTS)

然后我用Key

调用字典中的Value
name = prd_dic['0000']

在我的列表视图中,我修改了上下文以将全名输入到模板中

context['product_name'] = name

当我将一个对象传递到一个地方时,预期会出现一个 KeyError(使用 DeferredAttribute 对象)。

我的问题是,是否有一个内置函数可以解决上面的问题,或者在视图中作为转换和输入上下文的函数,或者直接在模型上进行这种转换?

想法是根据一个键table将保存的号码转换为全名以显示在模板中。

感谢您的一些意见。

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

方法get_product_number_display是自动为您定义的;您可以直接从模板调用它,无需覆盖 get_context_data.

参见the docs on get_FOO_display