Skip to content

Commit 59e34a3

Browse files
authored
ButtonCol form hidden fields (#90)
1 parent 79126ef commit 59e34a3

File tree

5 files changed

+61
-4
lines changed

5 files changed

+61
-4
lines changed

README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,9 @@ the `button_attrs` kwarg.
263263
You can pass a dict of attributes to add to the form element with
264264
the `form_attrs` kwarg.
265265

266-
[[Possible future work: make it so you can specify hidden fields to be
267-
added into the form.]]
266+
You can pass a dict of hidden fields to add into the form element with
267+
the `form_hidden_fields` kwargs. The keys will be used as the `name`
268+
attributes and the values as the `value` attributes.
268269

269270
More about `NestedTableCol`
270271
---------------------------

flask_table/columns.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ class ButtonCol(LinkCol):
315315

316316
def __init__(self, name, endpoint, attr=None, attr_list=None,
317317
url_kwargs=None, button_attrs=None, form_attrs=None,
318-
**kwargs):
318+
form_hidden_fields=None, **kwargs):
319319
super(ButtonCol, self).__init__(
320320
name,
321321
endpoint,
@@ -324,6 +324,7 @@ def __init__(self, name, endpoint, attr=None, attr_list=None,
324324
url_kwargs=url_kwargs, **kwargs)
325325
self.button_attrs = button_attrs or {}
326326
self.form_attrs = form_attrs or {}
327+
self.form_hidden_fields = form_hidden_fields or {}
327328

328329
def td_contents(self, item, attr_list):
329330
button_attrs = dict(self.button_attrs)
@@ -338,10 +339,21 @@ def td_contents(self, item, attr_list):
338339
method='post',
339340
action=self.url(item),
340341
))
342+
form_hidden_fields_elements = [
343+
element(
344+
'input',
345+
attrs=dict(
346+
type='hidden',
347+
name=name,
348+
value=value))
349+
for name, value in sorted(self.form_hidden_fields.items())]
341350
return element(
342351
'form',
343352
attrs=form_attrs,
344-
content=button,
353+
content=[
354+
''.join(form_hidden_fields_elements),
355+
button
356+
],
345357
escape_content=False,
346358
)
347359

flask_table/html.py

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ def _format_attrs(attrs, escape_attrs=True):
2525

2626

2727
def _format_content(content, escape_content=True):
28+
if isinstance(content, (list, tuple)):
29+
content = ''.join(content)
2830
if escape_content:
2931
return Markup.escape(content)
3032
return content

tests/__init__.py

+22
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,28 @@ def test_one(self):
657657
'button_form_attrs_test', 'test_one', items)
658658

659659

660+
class ButtonHiddenFieldsTest(FlaskTableTest):
661+
662+
class MyTable(Table):
663+
name = Col('Name')
664+
view = ButtonCol(
665+
'Delete',
666+
'delete',
667+
url_kwargs=dict(id_='id'),
668+
form_hidden_fields=dict(
669+
name1='value1',
670+
name2='value2',
671+
)
672+
)
673+
674+
maxDiff = None
675+
676+
def test_one(self):
677+
items = [Item(name='one', id=1)]
678+
self.assert_html_equivalent_from_file(
679+
'button_hidden_fields_test', 'test_one', items)
680+
681+
660682
class BoolTest(TableTest):
661683

662684
class MyTable(Table):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<table>
2+
<thead>
3+
<tr>
4+
<th>Name</th>
5+
<th>Delete</th>
6+
</tr>
7+
</thead>
8+
<tbody>
9+
<tr>
10+
<td>one</td>
11+
<td>
12+
<form action="/delete/1" method="post">
13+
<input name="name1" type="hidden" value="value1"></input>
14+
<input name="name2" type="hidden" value="value2"></input>
15+
<button type="submit">Delete</button>
16+
</form>
17+
</td>
18+
</tr>
19+
</tbody>
20+
</table>

0 commit comments

Comments
 (0)