Как обновить поле Django в шаблоне HTML

У меня есть Django-приложение, которое, помимо всего прочего, хочет, чтобы пользователь вводил дату рождения или свой возраст. При вводе одного из этих значений должно вычисляться другое, а при сохранении формы в базе данных должны обновляться оба значения. К сожалению, не похоже, что измененные данные отображаются при отправке формы. Если введен день рождения и вычислен возраст, clean() укажет, что возраст - None. Когда вводится возраст и вычисляется день рождения, все работает правильно. Я предполагаю, что это как-то связано с изменением свойства disabled, но не смог найти ничего, подтверждающего это. Я также наблюдал подобные результаты с другими полями, где я изменял флаг disabled.

Выдержка из models.py:

class Patient(models.Model):
    birthday = models.DateField(_('Birthday'), blank=True)
    age = models.IntegerField(_('Age'), blank=True)

Выдержка из файла forms.py

class PatientCreateForm(forms.ModelForm):
        
    birthday = forms.DateField(widget=DateInput(attrs={'type': 'date'}), required=True)
    age = forms.IntegerField(required=True)
    class Meta:
        model = Patient
        fields = [
            'birthday', 
            'age', 

Выдержка из файла views.py

def createpatient(request):
    if not request.user.is_authenticated:
        logger.debug(f'no user is logged in')
        login_url = reverse("login")
        next_url = reverse("create-patient")
        redirect_url = f'{login_url}?next={next_url}'
        logger.debug(f'redirect to {redirect_url}')
        return redirect(redirect_url)
   
    # value of patient_id is calculated here

    if request.method == 'POST':
        form = PatientCreateForm(request.POST, initial={'patient_id': patient_id})
        
        if form.is_valid():
            form.save()

            messages.success(request, _(f'Patient {form.cleaned_data.get('full_name')} has been created.'))
            return redirect('patient-list')
    
    else:
        form = PatientCreateForm(initial={'patient_id': patient_id})

    return render(request, 'patients/patient_form.html', {'form': form})

Выдержка из файла patient_form.html

Что я ожидаю в данном конкретном случае: Если введен день рождения, возраст должен быть рассчитан, и пользователь не должен иметь возможности ввести возраст. Если день рождения не введен, пользователь должен иметь возможность ввести возраст, а день рождения должен быть рассчитан. Поле дня рождения не должно быть отключено.

В других случаях, о которых я упоминал вскользь, у меня есть поле, значение которого по умолчанию равно 0. Если введено значение (например, 1), другие поля должны быть включены (т.е. disable = false) и введены значения. Здесь поля включаются правильно, но любые данные, введенные в них, игнорируются.

Можете ли вы попробовать это? Я не очень хорошо разбираюсь в JS, это может работать некорректно.

  1. Замените .prop('disabled', true) на .prop('readonly', true) для поля возраст.
  2. Обновите метод clean формы, чтобы он обрабатывал либо день рождения, либо возраст. Удалите required=True в форме. Если одно из полей может вычислять другое, то не следует требовать оба поля в форме declaration.
Вернуться на верх