# mysite/myapp/templatetags/myapp_extras.py
from django import template
from django.db.models.fields import FieldDoesNotExist
from mysite.myapp import models
register = template.Library()
@register.filter(name='verbose_name')
def verbose_name(value):
model_name, field_name = value.split('.')
model = getattr(models, model_name, None)
if not model:
return ''
try:
return model._meta.get_field(field_name).verbose_name
except FieldDoesNotExist, e:
return ''
在 template 裡的用法:{% load myapp_extras %}
...
{% mymodel.myfield|verbose_name %}
...
filter 的寫法可以參見官網的《Custom template tags and filters》, 滿簡單的。附帶一提, 要從字串拿出 model 時, 我楞了一下, 才發覺過去都沒想過「Python reflection API」。第一印象想到的是這種東西:
exec('model = %s' % model_name)
後來才想到不就是用 getattr 嗎..., 簡單到忘了它就是 reflection API。
沒有留言:
張貼留言