2010年5月1日 星期六

寫個 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。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...