Skip to content

Commit f6bf45c

Browse files
authored
Feature/form tag (#7)
1 parent b669d7f commit f6bf45c

File tree

5 files changed

+46
-5
lines changed

5 files changed

+46
-5
lines changed

docs/source/formify_helper.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
Unlike other form rendering packages, below template tags
66

77
```bash
8+
{% form_tag %}
89
{% render_form %}
910
{% render_submit %}
1011
{% render_field %}
@@ -34,6 +35,7 @@ FORMIFY = {
3435
Leveraging Python OOP, you can override some methods of the formify helper to customize the rendering behavior.
3536

3637
```bash
38+
{% form_tag %} -> formify_helper.render_form_tag
3739
{% render_form %} -> formify_helper.render_form
3840
{% render_submit %} -> formify_helper.render_submit
3941
{% render_field %} -> formify_helper.render_field

docs/source/tags.md

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
# Template Tags
22

3+
A typical case of using formify in a template is like this:
4+
5+
```html
6+
{% load formify %}
7+
8+
{% form_tag form action=url %}
9+
10+
{% csrf_token %}
11+
12+
{% render_form form %}
13+
14+
{% render_submit text='Submit' css_class="btn btn-primary" %}
15+
16+
{% endform_tag %}
17+
```
18+
19+
## form_tag
20+
21+
This tag is to render the form tag, it can help add some attributes to the form tag from the parameters from the template tag.
22+
323
## render_form
424

5-
This tag can render form or formset.
25+
This tag can render `form` or `formset`.
626

727
It will iterate and render all form fields automatically.
828

Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{% if self.should_render %}
22
<label for="{{ self.field.id_for_label }}" class="{{ self.formify_helper.label_class }}">
3-
{{ self.field.label|safe }} {{ self.asterisk_if_required|safe }}
3+
{# make sure no space between label and asterisk #}
4+
{{ self.field.label|safe }}{{ self.asterisk_if_required|safe }}
45
</label>
56
{% endif %}

src/django_formify/templatetags/formify.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def render(self, context: Context):
9191
key: safe_resolve(kwarg, context)
9292
for key, kwarg in self.context_kwargs.items()
9393
}
94-
form = resolved_component_args[0]
94+
form = resolved_component_args[0] if resolved_component_args else None
9595
formify_helper = init_formify_helper_for_form(form)
9696
content = self.nodelist.render(context)
9797
return formify_helper.render_form_tag(
@@ -121,9 +121,9 @@ def do_form_tag(parser, token):
121121
f"Internal error: Expected tag_name to be {tag_name}, but it was {tag_args[0].token}"
122122
)
123123

124-
if len(tag_args) != 2:
124+
if len(tag_args) > 2:
125125
raise TemplateSyntaxError(
126-
f"'{tag_name}' tag should have form as the first argument, other arguments should be keyword arguments."
126+
f"'{tag_name}' tag only accepts form as the first argument, other arguments should be keyword arguments."
127127
)
128128

129129
context_args = tag_args[1:]

tests/test_tags.py

+18
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ def test_form_tag(self):
2828
assert_select(html, "form[method='POST']", 1)
2929
assert_select(html, "form[action='/']", 1)
3030

31+
# should still work if do not pass in form
32+
template = Template(
33+
"""
34+
{% load formify %}
35+
{% with url='/' %}
36+
{% form_tag action=url %}
37+
{% render_form form %}
38+
{% endform_tag %}
39+
{% endwith %}
40+
"""
41+
)
42+
c = Context({"form": SampleForm()})
43+
html = template.render(c)
44+
45+
assert_select(html, "form", 1)
46+
assert_select(html, "form[method='POST']", 1)
47+
assert_select(html, "form[action='/']", 1)
48+
3149
def test_form_tag_extra_kwargs(self):
3250
template = Template(
3351
"""

0 commit comments

Comments
 (0)