寫個 filter 取出 model 欄位中的 verbose_name

查了一下 Django 好像沒內建這個功能, 要自己從 model 的 _meta 取出 field 的 verbose_name。就自己寫了個 filter:
# 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。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置