在Django的admin change模板中访问对象实例

Django提供了一个比较灵活的Admin系统,除了在admin.py中我们可以做各种各样的定义之外,还可以让我们自己定义指定的app或者Model的模板。比如如果我们需要对一个名为foo的app的admin模板做定制的话,只需要在该app下建立templates/admin/foo/的目录,然后把需要更改的模板放在这儿就可以了。当然前提是基于app的template loader已经加入到settings.py的指定位置。

乍一看你肯定会觉得这是一个相当便民的设计,可是假如你希望在change.html这个模板里访问正在被修改的实例时,问题来了,该对象实例在context中叫什么名称呢?在Django的文档中我没有找到相关的的对象名称,那么按照Generic View的命名规则,应该是叫object吧?试一试,未果,个么尝试obj,再次未果……匆匆忙忙地看了一下admin的源码,也没找到顺眼的名字。怎么办呢?这时候突然想起来admin中的form都是ModelForm,那么应该就可以使用ModelForm的instance属性来获取具体对象实例了吧。试了一下,果然,使用adminform.form.instance能够满足要求。这事就算了了。

今天闲来无事,又想起这个问题,总觉得通过这样的方式访问对象相当丑陋。琢磨了一下,突然想起Django Debug Toolbar提供了查看template context的方法。于是再次打开一个对象的修改页面,使用DDT检测了一下,才发现那对象好好的躺在名为original的字段下。再打开源码核对了一下,终于确定了这个事实。只怪之前看源码的时候只看Context的键值了,居然扰了这么大一弯才回到正轨,劳民伤财,惭愧啊……

发表评论

评论备注:

  1. 留言时的头像是Gravatar提供的服务。
  2. By submitting a comment here you grant this site a perpetual license to reproduce your words and name/web site in attribution. So, you don't fully own your words, so to speak.