Как в Django Forms сделать поле enabled или disabled в зависимости от boolean значения другого поля?
Есть класс 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
Должно быть как на скриншоте.
Ответы (2 шт):
Попробуй вот так: меня значение поля в моделях по умочанию на истину
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 %}
Спасибо за подсказку, 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 %}
