Opened 7 years ago
Last modified 7 years ago
#29656 closed Bug
Range Fields do not support blank values via ModelForm — at Initial Version
| Reported by: | James Addison | Owned by: | nobody |
|---|---|---|---|
| Component: | contrib.postgres | Version: | dev |
| 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
The filing of this issue is based on a discussion in IRC (see https://botbot.me/freenode/django/2018-08-09/?msg=103129716&page=12 and prior messages), followed up by creating a test project to reproduce the issue.
Please do correct me if I am misusing range fields.
Saving a modelform with a model's rangefield 2 inputs left empty triggers an DB integrity error. I think the culprit lies with empty_values not containing ['', ''] as a possible empty value. (see the code around https://github.com/django/django/blob/1.11.15/django/forms/fields.py#L1026)
With a view like:
def home(request):
if request.method == 'POST':
form = RangeTestForm(request.POST)
if form.is_valid():
instance = form.save()
else:
form = RangeTestForm(request.POST)
return render(request, 'rangefieldtest/home.html', {'form': form})
Form like:
class RangeTestForm(forms.ModelForm):
class Meta:
model = RangeTest
fields = '__all__'
and Model like:
from django.contrib.postgres.fields import FloatRangeField
from psycopg2._range import NumericRange
class RangeTest(models.Model):
name = models.CharField(max_length=50, blank=True, default='')
age_range = FloatRangeField(blank=True, default=NumericRange)
I will attach a sample project demonstrating this (use runserver, load the home page, click save)
psql table definition:
Table "public.rangefieldtest_rangetest"
Column | Type | Modifiers
-----------+-----------------------+-----------------------------------------------------------------------
id | integer | not null default nextval('rangefieldtest_rangetest_id_seq'::regclass)
name | character varying(50) | not null
age_range | numrange | not null
Indexes:
"rangefieldtest_rangetest_pkey" PRIMARY KEY, btree (id)
data successfully stored on save (when at least one of the rangefield's 2 inputs are filled in):
id | name | age_range ----+------+----------- 2 | | [3.0,) (1 row)
sample project reproducing the issue