Opened 5 years ago
Closed 5 years ago
#32286 closed Uncategorized (invalid)
Definition of JSONField causes issue with validation for a Falsey value
| Reported by: | Adam Carruthers | Owned by: | nobody |
|---|---|---|---|
| Component: | Forms | Version: | 3.1 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I ran into this issue while trying to create a JSONField that would contain a list of strings. The list of strings could have any length. I used the following:
model_field = models.JSONField(validator=[MyCustomValidator()])
The validator checks that the object is a list of strings along with some other stuff.
However, under this configuration, [] was not a valid entry because it was falsey and hence it failed the blank=False test.
So I set blank=True on the field to allow for []. But this led to the problem that if you have a falsey value then the validators aren't run. So I was able to set the field to be null on the admin site and it was permitted. But I really don't want to allow null as a value for fear of causing bugs in my code that uses the API. Even worse an empty string "" was allowed!
As it is, as far as I can tell, there is no way to create a field level validator that allows empty list and does not allow null. You could probably use a model level validator but that is non-ideal, and this feels like a potential way for bugs to emerge on a website.
Change History (1)
comment:1 by , 5 years ago
| Component: | Uncategorized → Forms |
|---|---|
| Resolution: | → invalid |
| Status: | new → closed |
Yes, Django doesn't run validators on empty values, however you can create a custom form field and change
empty_valuesto the([],), see #19997 and an example in tests. Please use one of support channels if you have further questions.