Как в Django Forms сделать поле enabled или disabled в зависимости от boolean значения другого поля?

Рейтинг: 0Ответов: 2Опубликовано: 30.04.2023

Есть класс Comment. Хочу сделать форму, в которой поле date_next_call будет активное, если need_call будет True и не активное, если False.

Нужно переопределить метод в CreateView, или это делается в html-шаблоне?

CheckboxInput автоматически связывается со значением boolean поля need_call, если например initial я ставлю False, то без галочки значение будет False, а с галочкой True?

Много чего перерыл, прошу прощения, если вопрос окажется глупым.
Буду признателен за любую помощь.

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['text', 'need_call', 'date_next_call']

    text = forms.CharField(label='Комментарий', widget=forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Введите текст', 'style': 'width: 500px'}))
    need_call = forms.BooleanField(initial=False, label='Назначить дату следующего звонка?', widget=forms.CheckboxInput(attrs={'class': 'checkboxInvoice', }))
    date_next_call = forms.DateTimeField(disabled=False, widget=forms.SelectDateWidget)


class Comment(models.Model):

    text = models.TextField('Комментарий', max_length=50, help_text="Введите название")
    date_create = models.DateTimeField('Дата создания', auto_now=True)  # не нужно добавлять в форму
    date_update = models.DateTimeField('Дата обновления', auto_now_add=True)  # не нужно добавлять в форму
    need_call = models.BooleanField('Поставить дату след звонка?', default=False)
    date_next_call = models.DateTimeField('Дата след. звонка', blank=True)
    company = ForeignKey('Company', on_delete=models.CASCADE)

    class Meta:
        ordering = ["date_update"]
        verbose_name = "Комментарий"
        verbose_name_plural = "Комментарии"

    def __str__(self):
        return self.text

Должно быть как на скриншоте.

введите сюда описание изображения

Ответы

▲ 0Принят

Попробуй вот так: меня значение поля в моделях по умочанию на истину

need_call = models.BooleanField('Поставить дату след звонка?', default=True)

На странице с формой Установи jquery плагин и следующий скрипт (у меня jquery в scripts/jquery)

{% block scripts %}
<script src="{% static 'script/jquery.js' %}"></script>
<script>
    $(document).on('change', $('#id_need_call'), (function (e) {
       $('#id_date_next_call')[0].toggleAttribute('disabled')
    }))
</script>
{% endblock %}
▲ 0

Спасибо за подсказку, Eziz Gapbarov.

В результате скрипт получился такой:

$(document).ready(function() {
    $('#id_need_call').on('change', (function (e) {
    if($(this).prop('checked')){
       $('#id_date_next_call').attr('disabled', false);
    } else {
        $('#id_date_next_call').attr('disabled', true);
    }
    }));
});

template такой:

    {% extends "manager_base/base.html" %}
    {% load static %}
    {% block content %}
    <script src="{% static 'js/jquery-3.6.4.min.js' %}"></script>
    <script src="{% static 'js/main.js' %}"></script>
    <form method="post">
        {% csrf_token %}
        <div class="form-group">
            <label for="id_text">Комментарий: </label>
            <input class="form-control" id="id_text" type="text" name="text" placeholder="Введите текст"
                   style="width: 500px; height: 200px; margin-bottom: 20px" required >
        </div>
        <div class="form-group">
            <label class="form-check-label" for="id_need_call">
                Назначить дату следующего звонка?
            </label>
            <input class="form-check-input" id="id_need_call" type="checkbox" name="need_call" style="margin-bottom: 20px"  >
    
        </div>
    <div class="form-group">
        <label for="id_date_next_call">Дата следующего звонка: </label>
        <input id="id_date_next_call" type="datetime-local" name="date_next_call" disabled="true" style="margin-bottom: 20px">
    </div>

    <input id="submit" type="submit" value="Сохранить">

</form>
{% endblock %}