def render_data(self, obj): """Renders the column data to a string. This may contain HTML.""" id_field = '%s_id' % self.field_name # Look for this directly so that we don't end up fetching the # data for the object. if id_field in obj.__dict__: pk = obj.__dict__[id_field] if pk in self.data_cache: return self.data_cache[pk] else: value = getattr(obj, self.field_name) self.data_cache[pk] = escape(value) return value else: # Follow . separators like in the django template library value = obj for field_name in filter(None, self.field_name.split('.')): value = getattr(value, field_name) if six.callable(value): value = value() return escape(value)
def render_cell(self, obj, render_context): """Renders the table cell containing column data.""" rendered_data = self.render_data(obj) url = '' css_class = '' if self.link: try: url = self.link_func(obj, rendered_data) except AttributeError: pass if self.css_class: if six.callable(self.css_class): css_class = self.css_class(obj) else: css_class = self.css_class key = "%s:%s:%s:%s" % (self.last, rendered_data, url, css_class) if key not in self.cell_render_cache: if not self.datagrid.cell_template_obj: self.datagrid.cell_template_obj = \ get_template(self.datagrid.cell_template) if not self.datagrid.cell_template_obj: logging.error("Unable to load template '%s' for datagrid " "cell. This may be an installation issue." % self.datagrid.cell_template, extra={ 'request': self.datagrid.request, }) ctx = Context(render_context) ctx.update({ 'column': self, 'css_class': css_class, 'url': url, 'data': mark_safe(rendered_data) }) self.cell_render_cache[key] = \ mark_safe(self.datagrid.cell_template_obj.render(ctx)) return self.cell_render_cache[key]