Skip to content

Commit d165e65

Browse files
[FIX] Corriger le rendu de bouton radio inline (#215)
* fix(form_field_snippet): inline radioselect were not displayed inline * fix(form_field_snippet): inline CheckboxSelectMultiple were not displayed inline * feat(example_app): inline radio and checkboxes without explicit calls to the templatetag * refactor(example_app): remove unused import Co-authored-by: Sylvain Boissel <sylvain@boissel.dev> * fix(widgets): inline checkboxes are still checkboxes Co-authored-by: Sylvain Boissel <sylvain@boissel.dev> * fix(widgets): include InlineCheckboxSelectMultiple in __all__ Co-authored-by: Sylvain Boissel <sylvain@boissel.dev> --------- Co-authored-by: Sylvain Boissel <sylvain@boissel.dev>
1 parent 944e46a commit d165e65

File tree

4 files changed

+90
-11
lines changed

4 files changed

+90
-11
lines changed

dsfr/templates/dsfr/form_field_snippets/field_snippet.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
{{ field.as_hidden }}
44
{% elif field|widget_type == "checkboxinput" %}
55
{% include "dsfr/form_field_snippets/checkbox_snippet.html" %}
6-
{% elif field|widget_type == "checkboxselectmultiple" %}
6+
{% elif field|widget_type == "checkboxselectmultiple" or field|widget_type == "inlinecheckboxselectmultiple" %}
77
{% include "dsfr/form_field_snippets/checkboxselectmultiple_snippet.html" %}
8-
{% elif field|widget_type == "radioselect" %}
8+
{% elif field|widget_type == "radioselect" or field|widget_type == "inlineradioselect" %}
99
{% include "dsfr/form_field_snippets/radioselect_snippet.html" %}
1010
{% elif field|widget_type == "richradioselect" %}
1111
{% include "dsfr/form_field_snippets/richradioselect_snippet.html" %}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from django import forms
2+
from django.template import Context, Template
3+
from django.test import SimpleTestCase
4+
5+
from dsfr.forms import DsfrBaseForm
6+
from dsfr.widgets import InlineRadioSelect, InlineCheckboxSelectMultiple
7+
8+
9+
class RadioSelectTestCase(SimpleTestCase):
10+
class DummyForm(DsfrBaseForm):
11+
radio_field = forms.ChoiceField(
12+
choices=(("a", "bla"), ("i", "bli"), ("o", "blo")),
13+
widget=forms.RadioSelect(),
14+
)
15+
16+
class DummyFormWithInlineRadioSelect(DsfrBaseForm):
17+
radio_field = forms.ChoiceField(
18+
choices=(("a", "bla"), ("i", "bli"), ("o", "blo")),
19+
widget=InlineRadioSelect(),
20+
)
21+
22+
def test_not_inline(self):
23+
rendered = Template("{{form}}").render(
24+
Context({"form": RadioSelectTestCase.DummyForm()})
25+
)
26+
self.assertFalse(
27+
'class="fr-fieldset__element fr-fieldset__element--inline"' in rendered
28+
)
29+
30+
def test_inline(self):
31+
rendered = Template("{{form}}").render(
32+
Context({"form": RadioSelectTestCase.DummyFormWithInlineRadioSelect()})
33+
)
34+
self.assertTrue(
35+
'class="fr-fieldset__element fr-fieldset__element--inline"' in rendered
36+
)
37+
38+
39+
class CheckboxSelectMultipleTestCase(SimpleTestCase):
40+
class DummyForm(DsfrBaseForm):
41+
checkbox_field = forms.ChoiceField(
42+
choices=(("a", "bla"), ("i", "bli"), ("o", "blo")),
43+
widget=forms.CheckboxSelectMultiple(),
44+
)
45+
46+
class DummyFormWithInlineCheckboxSelectMultiple(DsfrBaseForm):
47+
checkbox_field = forms.ChoiceField(
48+
choices=(("a", "bla"), ("i", "bli"), ("o", "blo")),
49+
widget=InlineCheckboxSelectMultiple(),
50+
)
51+
52+
def test_not_inline(self):
53+
rendered = Template("{{form}}").render(
54+
Context({"form": CheckboxSelectMultipleTestCase.DummyForm()})
55+
)
56+
self.assertFalse(
57+
'class="fr-fieldset__element fr-fieldset__element--inline"' in rendered
58+
)
59+
60+
def test_inline(self):
61+
rendered = Template("{{form}}").render(
62+
Context(
63+
{
64+
"form": CheckboxSelectMultipleTestCase.DummyFormWithInlineCheckboxSelectMultiple()
65+
}
66+
)
67+
)
68+
self.assertTrue(
69+
'class="fr-fieldset__element fr-fieldset__element--inline"' in rendered
70+
)

dsfr/widgets.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from typing import Type
22

3-
from django.forms.widgets import RadioSelect, ChoiceWidget
3+
from django.forms.widgets import RadioSelect, ChoiceWidget, CheckboxSelectMultiple
44

55
from dsfr.enums import RichRadioButtonChoices
66

77

8-
__all__ = ["RichRadioSelect"]
8+
__all__ = ["RichRadioSelect", "InlineRadioSelect", "InlineCheckboxSelectMultiple"]
99

1010

1111
class _RichChoiceWidget(ChoiceWidget):
@@ -131,3 +131,11 @@ class RichRadioSelect(_RichChoiceWidget, RadioSelect):
131131

132132
template_name = "dsfr/widgets/rich_radio.html"
133133
option_template_name = "dsfr/widgets/rich_radio_option.html"
134+
135+
136+
class InlineRadioSelect(RadioSelect):
137+
inline = True
138+
139+
140+
class InlineCheckboxSelectMultiple(CheckboxSelectMultiple):
141+
inline = True

example_app/forms.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
from crispy_forms.helper import FormHelper
1717
from crispy_forms.layout import Layout, Fieldset, Field
1818

19-
from dsfr.templatetags.dsfr_tags import dsfr_inline
2019
from dsfr.utils import lazy_static
21-
from dsfr.widgets import RichRadioSelect
20+
from dsfr.widgets import (
21+
RichRadioSelect,
22+
InlineRadioSelect,
23+
InlineCheckboxSelectMultiple,
24+
)
2225
from example_app.models import Author, Book
2326
from example_app.utils import populate_genre_choices
2427

@@ -138,7 +141,7 @@ class ExampleForm(DsfrBaseForm):
138141
label="Boutons radio inline",
139142
required=False,
140143
choices=[(1, "Premier choix"), (2, "Second choix"), (3, "Troisième choix")],
141-
widget=forms.RadioSelect,
144+
widget=InlineRadioSelect,
142145
)
143146

144147
sample_checkbox = forms.MultipleChoiceField(
@@ -154,14 +157,14 @@ class ExampleForm(DsfrBaseForm):
154157
)
155158

156159
sample_checkbox_inline = forms.MultipleChoiceField(
157-
label="Cases à cocher",
160+
label="Cases à cocher inline",
158161
required=False,
159162
choices=[
160163
("1", "Premier choix"),
161164
("2", "Second choix"),
162165
("3", "Troisième choix"),
163166
],
164-
widget=forms.CheckboxSelectMultiple,
167+
widget=InlineCheckboxSelectMultiple,
165168
)
166169

167170
sample_rich_radio = forms.ChoiceField(
@@ -218,8 +221,6 @@ def clean_sample_checkbox(self):
218221
def __init__(self, *args, **kwargs):
219222
super().__init__(*args, **kwargs)
220223
self.set_autofocus_on_first_error()
221-
dsfr_inline(self["sample_radio_inline"])
222-
dsfr_inline(self["sample_checkbox_inline"])
223224

224225

225226
class AuthorCreateForm(ModelForm, DsfrBaseForm):

0 commit comments

Comments
 (0)