我有一個Scrib
模型,它得到Scrib.objects.all()
存入scribs
Django的 - 模板對象訪問冗長的名字
在模板中的模板,我想獲得像模型的詳細名稱:
<h1>{{ scribs.model.verbose_name }}</h1>
是否有可能或者必須將Scrib
處理程序添加到上下文中?
我有一個Scrib
模型,它得到Scrib.objects.all()
存入scribs
Django的 - 模板對象訪問冗長的名字
在模板中的模板,我想獲得像模型的詳細名稱:
<h1>{{ scribs.model.verbose_name }}</h1>
是否有可能或者必須將Scrib
處理程序添加到上下文中?
您無法直接從模板訪問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類繼承的模型都將具有此屬性。這是最乾淨和最靈活的解決方案。
或者到WTK的建議,你可以在你的models.py
定義了Scrib的模型的方法是這樣的:
def get_verbose_name(self):
return self._meta.verbose_name
# in templates
{{ scrib_instance.get_verbose_name }}
我是否必須爲所有需要詳細名稱的對象創建此方法,還是有更簡單的方法? –
@PierredeLESPINAY您可以擁有一個基本的抽象模型,並讓所有模型都可以從中擴展。寫一次,全部使用。 – Chris
我想這樣做的很好,我想另一種解決方案將是一個模板過濾器:
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
其實'scribs'等於牛逼o'Scrib.objects.all()'所以它是一個多重對象。我是否必須將'Scrib'而不是'Scrib.objects.all()'放入'scribs'? –
那麼,如果你通過scribs在你的模板中循環,那麼你可以在循環中的scrib的每個實例上使用'.meta.verbose_name'。如果你想只顯示一次(例如在實際循環之前),你可以簡單地使用'{{scribs.0.meta.verbose_name}}'來顯示使用scribs數組中的第一個scrib的詳細名稱。 – WTK
我不能直接把'Scrib'模型放入'scribs',通過'scribs.objects.all'循環並使用'scribs.verbose_name'或更簡單的東西?否則,我將不得不把這個功能放在我所有的模型上? –