优化PartialRenderFormMixin性能

前文(Django分多此渲染(输出)同一个form)提到一个集成bootstratp_toolkit的方案,实际使用过程中发现其性能非常之差。开始怀疑是因为render_fields字段筛选导致,经排查问题不在这里,后来怀疑是模板渲染的性能,但直接使用bootstrap_toolkit并未表现出性能问题。仔细研究了as_bootstrap的源代码,上文提到的方法在使用这个方法是逐个字段调用,每次调用都会进行一次模板的查找与编译过程因而性能就受到了严重的映像;而通常在模板上我们是将一个form传递进去,只做一次模板查找与编译,因而就不会产生问题。

修改方法也非常简单,只要缓存Template对象,每次使用其render方法即可:

  def _get_bootstrap_template(self, layout='vertical,false'):
        """
            Render a field or a form according to Bootstrap guidelines
            """
        params = split(layout, ",")
        layout = str(params[0]).lower()

        try:
            float = str(params[1]).lower() == "float"
        except IndexError:
            float = False

        return get_template("bootstrap_toolkit/field.html"),layout,float


    def as_bootstrip(self, render_fields=None, layout='vertical,false'):
        output = []
        template,layout,float = self._get_bootstrap_template(layout)
        for name, field in self.fields.items():
            if render_fields and  not name in render_fields:
                continue
            f = BoundField(self, field, name)
            output.append(template.render(
                Context({
                    'field': f,
                    'layout': layout,
                    'float': float,
                })
            ))

        return mark_safe(u''.join(output))
posted @ 2012-10-13 16:55  雨吁的嘘  阅读(264)  评论(0)    收藏  举报