#32625: JSONField with callable default reports ModelForm.has_changed() when it
hasn't
-----------------------------------------+------------------------
               Reporter:  Stuart Kelly   |          Owner:  nobody
                   Type:  Uncategorized  |         Status:  new
              Component:  Uncategorized  |        Version:  3.2
               Severity:  Normal         |       Keywords:
           Triage Stage:  Unreviewed     |      Has patch:  0
    Needs documentation:  0              |    Needs tests:  0
Patch needs improvement:  0              |  Easy pickings:  0
                  UI/UX:  0              |
-----------------------------------------+------------------------
 The issue is similar to this bug that has been fixed:
 https://code.djangoproject.com/ticket/24428 however isn't due to coercion

 test case to reproduce (in a new django project/app)

 {{{
 from django.db import models
 from django.forms import ModelForm


 class Vehicle(models.Model):
     modifications = models.JSONField(default=list, blank=True, null=True)


 class VehicleForm(ModelForm):
     class Meta:
         model = Vehicle
         fields = ("modifications", )


 def test_vehicle_form():
     vehicle = Vehicle.objects.create()
     assert vehicle.modifications == []
     data = {"modifications": "[]"}
     form = VehicleForm(data, instance=vehicle)
     assert form.is_valid()
     assert not form.has_changed()
 }}}

 I would expect that test to pass, but it doesn't. I'm not sure exactly
 where the error lies, but I have discovered the following:

 {{{
 field.show_hidden_initial == True
 field.to_python(hidden_widget.value_from_datadict(self.data, self.files,
 initial_prefixed_name)) == None
 }}}
 which then fails the check in field.has_changed
 {{{
 initial_value = initial if initial is not None else ''
 data_value = data if data is not None else ''
 return initial_value != data_value
 }}}
 because `data == []`

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32625>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/054.87e945d98e91f2db7f5dabe04617469c%40djangoproject.com.

Reply via email to