Skip to content

Commit 2b734cc

Browse files
committed
Add optional context_object_name to TemplateColumn and make extra_context optionally callable
fixes: #928
1 parent 8d2dfad commit 2b734cc

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

django_tables2/columns/templatecolumn.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from django.template.loader import get_template
33
from django.utils.html import strip_tags
44

5+
from django_tables2.utils import call_with_appropriate
6+
57
from .base import Column, library
68

79

@@ -40,11 +42,19 @@ class ExampleTable(tables.Table):
4042

4143
empty_values = ()
4244

43-
def __init__(self, template_code=None, template_name=None, extra_context=None, **extra):
45+
def __init__(
46+
self,
47+
template_code=None,
48+
template_name=None,
49+
context_object_name="record",
50+
extra_context=None,
51+
**extra
52+
):
4453
super().__init__(**extra)
4554
self.template_code = template_code
4655
self.template_name = template_name
4756
self.extra_context = extra_context or {}
57+
self.context_object_name = context_object_name
4858

4959
if not self.template_code and not self.template_name:
5060
raise ValueError("A template must be provided")
@@ -56,11 +66,18 @@ def render(self, record, table, value, bound_column, **kwargs):
5666
additional_context = {
5767
"default": bound_column.default,
5868
"column": bound_column,
59-
"record": record,
69+
self.context_object_name: record,
6070
"value": value,
6171
"row_counter": kwargs["bound_row"].row_counter,
6272
}
63-
additional_context.update(self.extra_context)
73+
74+
extra_context = self.extra_context
75+
if callable(extra_context):
76+
extra_context = call_with_appropriate(
77+
extra_context,
78+
{"record": record, "table": table, "value": value, "bound_column": bound_column},
79+
)
80+
additional_context.update(extra_context)
6481
with context.update(additional_context):
6582
if self.template_code:
6683
return Template(self.template_code).render(context)
@@ -75,3 +92,6 @@ def value(self, **kwargs):
7592
"""
7693
html = super().value(**kwargs)
7794
return strip_tags(html).strip() if isinstance(html, str) else html
95+
96+
def get_context_data(self, **kwargs):
97+
return

tests/columns/test_templatecolumn.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,19 @@ class Table(tables.Table):
115115
table = Table([{"track": "Space Oddity"}])
116116

117117
self.assertEqual(list(table.as_values()), [["Track"], ["Space Oddity"]])
118+
119+
def test_context_object_name(self):
120+
class Table(tables.Table):
121+
name = tables.TemplateColumn("{{ user.name }}", context_object_name="user")
122+
123+
table = Table([{"name": "Bob"}])
124+
self.assertEqual(list(table.as_values()), [["Name"], ["Bob"]])
125+
126+
def test_extra_context_callable(self):
127+
class Table(tables.Table):
128+
size = tables.TemplateColumn(
129+
"{{ size }}", extra_context=lambda record: {"size": record["clothes"]["size"]}
130+
)
131+
132+
table = Table([{"clothes": {"size": "XL"}}])
133+
self.assertEqual(list(table.as_values()), [["Size"], ["XL"]])

0 commit comments

Comments
 (0)