Skip to content

Commit ef0ac88

Browse files
committed
Fix dependent_fields with checkbox
1 parent e5f41e6 commit ef0ac88

File tree

4 files changed

+53
-2
lines changed

4 files changed

+53
-2
lines changed

django_select2/static/django_select2/django_select2.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@
3535
$.each(dependentFields, function (i, dependentField) {
3636
const nameIs = `[name=${dependentField}]`
3737
const nameEndsWith = `[name$=-${dependentField}]`
38-
result[dependentField] = (findElement(nameIs) || findElement(nameEndsWith)).val()
38+
const field = (findElement(nameIs) || findElement(nameEndsWith))
39+
if (field.is(":checkbox")) {
40+
result[dependentField] = field.prop("checked") ? "1" : "0"
41+
} else {
42+
result[dependentField] = field.val()
43+
}
3944
})
4045
}
4146

tests/test_forms.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,49 @@ def test_dependent_fields_clear_after_change_parent(
844844
)
845845
assert city2_container.text == ""
846846

847+
@pytest.mark.selenium
848+
def test_dependent_fields_using_checkbox(
849+
self, db, live_server, driver, cities
850+
):
851+
driver.get(live_server + self.url)
852+
(
853+
country_container,
854+
city_container,
855+
city2_container,
856+
) = driver.find_elements(By.CSS_SELECTOR, ".select2-selection--single")
857+
858+
# selecting a country really does it
859+
city_container.click()
860+
WebDriverWait(driver, 60).until(
861+
expected_conditions.presence_of_element_located(
862+
(By.CSS_SELECTOR, ".select2-results li")
863+
)
864+
)
865+
city_option = driver.find_element(
866+
By.CSS_SELECTOR, ".select2-results li"
867+
)
868+
city_name = city_option.text
869+
city_option.click()
870+
assert city_name == city_container.text
871+
872+
# check active to false
873+
active_checkbox = driver.find_element(
874+
By.ID, 'id_active'
875+
)
876+
active_checkbox.click()
877+
878+
# check the value in city
879+
city_container.click()
880+
WebDriverWait(driver, 60).until(
881+
expected_conditions.presence_of_element_located(
882+
(By.CSS_SELECTOR, ".select2-results li")
883+
)
884+
)
885+
city_option = driver.find_element(
886+
By.CSS_SELECTOR, ".select2-results li"
887+
)
888+
assert city_option.text == "No results found"
889+
847890

848891
@pytest.fixture(
849892
name="widget",

tests/testapp/forms.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class AddressChainedSelect2WidgetForm(forms.Form):
209209
label="City",
210210
widget=ModelSelect2Widget(
211211
search_fields=["name__icontains"],
212-
dependent_fields={"country": "country"},
212+
dependent_fields={"country": "country", "active": "active"},
213213
max_results=500,
214214
attrs={"data-minimum-input-length": 0},
215215
),
@@ -226,6 +226,8 @@ class AddressChainedSelect2WidgetForm(forms.Form):
226226
),
227227
)
228228

229+
active = forms.BooleanField(required=False, initial=True)
230+
229231

230232
class GroupieForm(forms.ModelForm):
231233
class Meta:

tests/testapp/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class City(models.Model):
5959
country = models.ForeignKey(
6060
"Country", related_name="cities", on_delete=models.CASCADE
6161
)
62+
active = models.BooleanField(default=True, blank=True)
6263

6364
class Meta:
6465
ordering = ("name",)

0 commit comments

Comments
 (0)