Как скрыть некоторое поле на основе forms.select django
Я хочу скрыть некоторые поля, когда пользователь выбирает опцию, но когда я пытаюсь сделать это, это не работает, я не знаю, забыл ли я что-то в моем коде или сделал ошибку, но я пробовал много вещей, и это не работает. В моей модели у меня есть выбор с "IN" и "Out", так что я хочу, чтобы при выборе OUT некоторые поля моей формы были скрыты, в противном случае отображалась вся форма. вот мой model.py
CHOICES = (
("1", "IN"),
("2", "OUT")
)
class addReport(models.Model):
heure = models.TimeField(auto_now_add=True)
mouve = models.CharField(max_length=12, choices = CHOICES)
nom_Visiteur = models.CharField(max_length=26)
fonction = models.CharField(max_length=26)
service = models.CharField(max_length=26)
motif = models.CharField(max_length=26)
phoneNumber = models.CharField(max_length=12, unique= True)
вот мой forms.py
from django import forms
from .models import addReport
from django.forms import ModelForm
class PostForms(forms.ModelForm):
class Meta:
model = addReport
fields = ('mouve','nom_Visiteur','fonction','service','motif','phoneNumber')
widgets = {
'mouve': forms.Select(attrs={'class': 'form-control'}),
'nom_Visiteur': forms.TextInput(attrs={'class': 'form-control'}),
'fonction': forms.TextInput(attrs={'class': 'form-control'}),
'service': forms.TextInput(attrs={'class': 'form-control'}),
'motif': forms.Textarea(attrs={'class': 'form-control'}),
'phoneNumber': forms.TextInput(attrs={'class': 'form-control'}),
}
def __init__(self, data=None, *args, **kwargs):
super().__init__(data, *args, **kwargs)
# If 'later' is chosen, mark send_dt as required.
if data and data.get('mouve', None) == self.OUT:
self.fields['fonction'] = forms.HiddenInput(),
self.fields['service'] = forms.HiddenInput(),
вот мой views.py
from django.shortcuts import render
from django.views.generic import TemplateView, ListView
from .models import addReport
from .forms import PostForms
from django.views.generic.edit import CreateView
from django.contrib import messages #import messages
from django.contrib.messages.views import SuccessMessageMixin
class CreateProduct(CreateView, SuccessMessageMixin):
model = addReport
template_name = 'home.html'
form_class = PostForms
success_url = "."
success_message = "Votre raport a ete enregistrer"
def dispatch(self, request, *args, **kwargs):
self.request = request
return super().dispatch(request, *args, **kwargs)
def form_valid(self, form):
obj = form.save(commit=False)
obj.save()
return super().form_valid(form)
и вот мой home.html
<div class="h-100 ml-5 mr-5 mb-5 align-items-center justify-content-center mt-5" style="width: 30;">
{% if messages %}
{% for message in messages %}
<div class="text-center alert alert-{{ message.tags}}">
{{ message|safe }}
</div>
{% endfor %}
{% endif %}
<div class="p-3 mb-2 bg-light text-black rounded">
<form method="post" action=" ">
{% csrf_token %}
{{ form|crispy }}
<br>
<div>
<button class="btn btn-success" type="submit">
Enregistrer
</button>
</div>
</form>
</div>
</div>
Я хочу, чтобы поля fonction, service были скрыты при выборе Out. Спасибо
Наверное, проще всего сделать это с помощью javascript. Существуют различные способы сделать это. Вот простой пример. Это просто скрывает и отключает некоторые элементы формы, основываясь на значении другого элемента формы. Если вы используете что-то подобное, вы должны изменить значения querySelector на что-то подходящее для ваших фактических элементов формы.
(function() {
var mouveSelect = document.querySelector('select[name=mouve]')
function hideFormElementsIfMouveIsOUT() {
var shouldHide = mouveSelect.value === 'OUT'
document.querySelectorAll('[name=fonction], [name=service]')
.forEach(function(element) {
element.style.display = shouldHide ? 'none' : null
element.disabled = shouldHide
// this logging statement is just for showing what the example does
console.log((shouldHide ? 'hide' : 'show'), 'element', element)
})
}
mouveSelect.addEventListener('change', hideFormElementsIfMouveIsOUT)
hideFormElementsIfMouveIsOUT()
})()
<form>
<select name=mouve>
<option>IN</option>
<option>OUT</option>
</select>
<select name=fonction>
<option>A</option>
<option>B</option>
</select>
<input name=service placeholder=service />
<input name=somethingElse placeholder='something else' />
</form>