'django form changed_data method: why checked radio button always in changed_data even if not changed?
I want to check when field has been changed when submitting of form with Django. There are tow form attributed that can be used: has_changed (return True if at least one field has been changed) and changed_data (that return list of changed field).
But for a reason I can not understand, when a radio button field is checked, has_changed will always return True, even if not changed (and filed is in changed_data list)
In the example belwo, inc_dat field (date field) behavior is correct but not inc_oui_age which is a radio button
models.py
class Inclusion(models.Model):
""" A class to create a Inclusion instance. """
_safedelete_policy = SOFT_DELETE_CASCADE
# insert model fields
ide = models.AutoField(primary_key=True)
pat = models.ForeignKey('Patient',on_delete = models.CASCADE, related_name='inclusion_patient', db_column='pat')
inc_dat = models.DateField('Date de la visite', null=True, blank=True)
inc_oui_age = models.IntegerField('18 ans ≤ âge ≤ 45 ans OU âge ≥ 55 ans', null=True, blank=True)
...
forms.py
class InclusionForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.IDE = kwargs.pop("ide", None)
self.PATIENT = kwargs.pop("patient", None)
self.USER = kwargs.pop("user", None)
super(InclusionForm,self).__init__(*args, **kwargs)
self.fields['inc_dat'] = forms.DateField(label = 'Date de la visite',widget=forms.TextInput(attrs={'autocomplete': 'off'}),required=False, disabled=DISABLED)
self.fields['inc_oui_age'] = forms.TypedChoiceField(label = '18 ans ≤ âge ≤ 45 ans OU âge ≥ 55 ans',widget=forms.RadioSelect(attrs={'disabled': DISABLED}),required=False,choices=[i for i in Thesaurus.options_list(1,'fr') if i != (None,'')], empty_value=None, disabled=DISABLED)
templates
<!--date-->
<div class="row mb-0">
<div class="input-group input-group-sm col-6">
<label>{{ form.inc_dat.label }}</label>
</div>
<div class="input-group input-group-sm mb-1 col-2">
{{ form.inc_dat }}
<div class="input-group-append">
<span class="input-group-text rounded-right" id="basic-addon2"><span data-feather="calendar"></span></span>
</div>
{% for error in form.inc_dat.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
</div>
<!--Radio buttons-->
<div class="row mb-0">
<div class="col-6">
<label>{{ form.inc_oui_age.label }}</label>
</div>
<div class="col-2 inline-block">
{% for radio in form.inc_oui_age %}
<label for="{{ radio.id_for_label }}">
<span class="radio">{{ radio.tag }}</span><span class="ml-1 mr-2">{{ radio.choice_label }}</span>
</label>
{% endfor %}
</div>
</div>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
