# 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。
沒有留言:
張貼留言