2011-09-15 59 views

回答

10

您無法直接從模板訪問verbose_name。從我看到你有三個選擇。

選項一(最簡單)。在你的控制器分配冗長的名稱,然後從模板訪問:

# in controller 
render_to_response('template.html', {'scrib_verbose_name': Scrib._meta.verbose_name}) 

# in a view template.html 
Verbose name of a Scrib model: {{ scrib_verbose_name }} 

選項二:自己寫一個視圖助手將返回verbose_name(或_meta類其他字段)給定類。

更新第三個選項(Uku Loskit的帽子提示) - 在scrib模型上定義一個返回元對象(或任何特定字段)的方法。

# method in a Scrib model 
def meta(self): 
    return self._meta 

# later on in a template - scrib is a instance of Scrib model 
<h1>{{ scrib.meta.verbose_name }}</h1> 

UPDATE2如果硬要直接從scribs訪問冗長的名稱(這是Scrib.objects.all()結果),那麼你可以做這樣的東西:

scribs = Scrib.objects.all() 
scribs.verbose_name = Scrib._meta.verbose_name 

# in a template you can now access verbose name from a scribs variable 
{{ scribs.verbose_name }} 

UPDATE3另一種方式要使用模型inhertinace能夠從任何模型的實例中訪問我們自定義模型的詳細名稱。

# base model (inherits from models.Model) 
class CustomModel(models.Model): 
    def meta(self): 
     return self._meta 

    class Meta: 
     abstract = True 

# Scrib now inherit from CustomModel 
class Scrib(CustomModel): 
    # do any stuff you want here ... 

Scrib的,現在從CustomModel爲我們提供財產繼承。任何將從CustomModel類繼承的模型都將具有此屬性。這是最乾淨和最靈活的解決方案。

+0

其實'scribs'等於牛逼o'Scrib.objects.all()'所以它是一個多重對象。我是否必須將'Scrib'而不是'Scrib.objects.all()'放入'scribs'? –

+0

那麼,如果你通過scribs在你的模板中循環,那麼你可以在循環中的scrib的每個實例上使用'.meta.verbose_name'。如果你想只顯示一次(例如在實際循環之前),你可以簡單地使用'{{scribs.0.meta.verbose_name}}'來顯示使用scribs數組中的第一個scrib的詳細名稱。 – WTK

+0

我不能直接把'Scrib'模型放入'scribs',通過'scribs.objects.all'循環並使用'scribs.verbose_name'或更簡單的東西?否則,我將不得不把這個功能放在我所有的模型上? –

5

或者到WTK的建議,你可以在你的models.py定義了Scrib的模型的方法是這樣的:

def get_verbose_name(self): 
    return self._meta.verbose_name 
# in templates 
{{ scrib_instance.get_verbose_name }} 
+0

我是否必須爲所有需要詳細名稱的對象創建此方法,還是有更簡單的方法? –

+1

@PierredeLESPINAY您可以擁有一個基本的抽象模型,並讓所有模型都可以從中擴展。寫一次,全部使用。 – Chris

8

我想這樣做的很好,我想另一種解決方案將是一個模板過濾器:

from django import template 
register = template.Library() 

@register.filter 
def verbose_name(value): 
    return value._meta.verbose_name 

@register.filter 
def verbose_name_plural(value): 
    return value._meta.verbose_name_plural 

然後在模板:

1 {{ object|verbose_name }}, 2 {{ object|verbose_name_plural }} 

1 scrib, 2 scribs