Skip to content

Commit 15ddefb

Browse files
authored
Merge pull request #54 from benavlabs/false-checkbox-fix
Required Bool fix
2 parents f72d7b8 + 8e31b1e commit 15ddefb

File tree

3 files changed

+135
-21
lines changed

3 files changed

+135
-21
lines changed

crudadmin/admin_interface/model_view.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,24 @@ async def form_create_endpoint_inner(
597597
for field in form_fields:
598598
key = field["name"]
599599
raw_value = form_data_raw.getlist(key)
600-
if len(raw_value) == 1:
600+
601+
if field["type"] == "checkbox":
602+
if raw_value and len(raw_value) == 1:
603+
value_str = raw_value[0]
604+
if value_str == "true":
605+
form_data[key] = True
606+
field_values[key] = True
607+
elif value_str == "false":
608+
form_data[key] = False
609+
field_values[key] = False
610+
else:
611+
form_data[key] = bool(value_str)
612+
field_values[key] = bool(value_str)
613+
else:
614+
has_default = field.get("default") is not None
615+
form_data[key] = None if has_default else False
616+
field_values[key] = None if has_default else False
617+
elif len(raw_value) == 1:
601618
value = raw_value[0]
602619
form_data[key] = value if value else field.get("default")
603620
field_values[key] = value
@@ -1168,6 +1185,27 @@ async def form_update_endpoint_inner(
11681185
update_data: Dict[str, Any] = {}
11691186
has_updates = False
11701187

1188+
for field in form_fields:
1189+
key = field["name"]
1190+
if field["type"] == "checkbox":
1191+
raw_values = form_data.getlist(key)
1192+
if raw_values and len(raw_values) == 1:
1193+
value_str = raw_values[0]
1194+
if value_str == "true":
1195+
update_data[key] = True
1196+
field_values[key] = True
1197+
elif value_str == "false":
1198+
update_data[key] = False
1199+
field_values[key] = False
1200+
else:
1201+
update_data[key] = bool(value_str)
1202+
field_values[key] = bool(value_str)
1203+
has_updates = True
1204+
elif field.get("default") is None:
1205+
update_data[key] = False
1206+
field_values[key] = False
1207+
has_updates = True
1208+
11711209
for key, raw_val in form_data.items():
11721210
if isinstance(raw_val, UploadFile):
11731211
field_values[key] = raw_val

crudadmin/templates/admin/model/create.html

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,25 @@
221221
gap: 0.5rem;
222222
}
223223

224+
.create-form-container .radio-group {
225+
display: flex;
226+
gap: 1.5rem;
227+
margin-top: 0.5rem;
228+
}
229+
230+
.create-form-container .radio-option {
231+
display: flex;
232+
align-items: center;
233+
gap: 0.5rem;
234+
cursor: pointer;
235+
font-weight: normal;
236+
}
237+
238+
.create-form-container .radio-option input[type="radio"] {
239+
cursor: pointer;
240+
width: auto;
241+
}
242+
224243
.create-form-container .form-control[type="number"] {
225244
-moz-appearance: none;
226245
}
@@ -298,16 +317,35 @@ <h1 class="page-title">Create {{ model_name }}</h1>
298317
</select>
299318

300319
{% elif field.type == "checkbox" %}
301-
<div class="checkbox-wrapper">
302-
<input class="form-control{% if field.name in field_errors %} error{% endif %}"
303-
type="checkbox"
304-
id="{{ field.name }}"
305-
name="{{ field.name }}"
306-
{% if field_values and field_values[field.name] %}checked{% endif %}>
307-
{% if field.description %}
308-
<span class="checkbox-label">{{ field.description }}</span>
309-
{% endif %}
310-
</div>
320+
{% if field.default is not none %}
321+
<div class="radio-group">
322+
<label class="radio-option">
323+
<input type="radio"
324+
name="{{ field.name }}"
325+
value="true"
326+
{% if field_values and field_values[field.name] == True %}checked{% elif not field_values and field.default == True %}checked{% endif %}>
327+
<span>True</span>
328+
</label>
329+
<label class="radio-option">
330+
<input type="radio"
331+
name="{{ field.name }}"
332+
value="false"
333+
{% if field_values and field_values[field.name] == False %}checked{% elif not field_values and field.default == False %}checked{% endif %}>
334+
<span>False</span>
335+
</label>
336+
</div>
337+
{% else %}
338+
<div class="checkbox-wrapper">
339+
<input class="form-control{% if field.name in field_errors %} error{% endif %}"
340+
type="checkbox"
341+
id="{{ field.name }}"
342+
name="{{ field.name }}"
343+
{% if field_values and field_values[field.name] %}checked{% endif %}>
344+
{% if field.description %}
345+
<span class="checkbox-label">{{ field.description }}</span>
346+
{% endif %}
347+
</div>
348+
{% endif %}
311349

312350
{% elif field.type == "json" %}
313351
<textarea class="form-control{% if field.name in field_errors %} error{% endif %}"

crudadmin/templates/admin/model/update.html

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,25 @@
244244
gap: 0.5rem;
245245
}
246246

247+
.radio-group {
248+
display: flex;
249+
gap: 1.5rem;
250+
margin-top: 0.5rem;
251+
}
252+
253+
.radio-option {
254+
display: flex;
255+
align-items: center;
256+
gap: 0.5rem;
257+
cursor: pointer;
258+
font-weight: normal;
259+
}
260+
261+
.radio-option input[type="radio"] {
262+
cursor: pointer;
263+
width: auto;
264+
}
265+
247266
.form-control[type="number"] {
248267
-moz-appearance: none;
249268
}
@@ -310,16 +329,35 @@ <h1 class="page-title">Update {{ model_name }}</h1>
310329
</select>
311330

312331
{% elif field.type == "checkbox" %}
313-
<div class="checkbox-wrapper">
314-
<input class="form-control{% if field.name in field_errors %} error{% endif %}"
315-
type="checkbox"
316-
id="{{ field.name }}"
317-
name="{{ field.name }}"
318-
{% if field_values and field_values[field.name] %}checked{% endif %}>
319-
{% if field.description %}
320-
<span class="checkbox-label">{{ field.description }}</span>
321-
{% endif %}
322-
</div>
332+
{% if field.default is not none %}
333+
<div class="radio-group">
334+
<label class="radio-option">
335+
<input type="radio"
336+
name="{{ field.name }}"
337+
value="true"
338+
{% if field_values and field_values[field.name] == True %}checked{% endif %}>
339+
<span>True</span>
340+
</label>
341+
<label class="radio-option">
342+
<input type="radio"
343+
name="{{ field.name }}"
344+
value="false"
345+
{% if field_values and field_values[field.name] == False %}checked{% endif %}>
346+
<span>False</span>
347+
</label>
348+
</div>
349+
{% else %}
350+
<div class="checkbox-wrapper">
351+
<input class="form-control{% if field.name in field_errors %} error{% endif %}"
352+
type="checkbox"
353+
id="{{ field.name }}"
354+
name="{{ field.name }}"
355+
{% if field_values and field_values[field.name] %}checked{% endif %}>
356+
{% if field.description %}
357+
<span class="checkbox-label">{{ field.description }}</span>
358+
{% endif %}
359+
</div>
360+
{% endif %}
323361

324362
{% elif field.type == "json" %}
325363
<textarea class="form-control{% if field.name in field_errors %} error{% endif %}"

0 commit comments

Comments
 (0)