Поле условной формы в форме мастера Django

Я использую формы мастера в django. Я хочу создать поле формы, только если ответ на какое-либо другое поле формы помечен как «да», иначе мне не нужно это новое поле формы. Как я могу это сделать?
Я пробовал некоторые другие ответы, связанные с этим, но большинство из них говорят о том, как пометить поле обязательным или нет, но я хочу отображать это поле, только если ответ на другое поле «Да»

Мастер форм Django с условными вопросами

В приведенном ниже коде я хочу отображать поле «Пул2», только если ответ на поле «Пул» отмечен «да», иначе мне это поле не нужно. В основном я хочу получить некоторые сведения о пуле в поле «Бассейн2», если в доме пользователя есть пул.

forms.py

class ListingForm2(forms.Form):
     Pool = (
        ("Yes","Yes"),
        ("No","No"),
    )
    Pool = forms.ChoiceField(choices = Pool,label = "Does your property have a pool ?")
    Pool2 = forms.CharField(required=False)

Views.py

class ListingWizard(SessionWizardView):
    template_name = 'listing_form.html'
    form_list = [ListingForm1,ListingForm2,ListingForm3,ListingForm4]
    def done(self, form_list, **kwargs):
        save_data(form.cleaned_data for form in form_list)
        return render(self.request,'done.html',{
            'form_data' : [form.cleaned_data for form in form_list],
            })

person Kanish Anand    schedule 13.07.2019    source источник
comment
Используйте javascript для отображения и скрытия поля при изменении поля выбора.   -  person Shubhitgarg    schedule 20.07.2019
comment
нет другого способа, кроме как использовать javascript ? @Shubhitgarg   -  person Kanish Anand    schedule 20.07.2019
comment
так как вы ожидаете каких-то изменений на стороне клиента, здесь нужен javascript или css   -  person PRMoureu    schedule 20.07.2019
comment
хорошо, спасибо @PRMoureu   -  person Kanish Anand    schedule 20.07.2019


Ответы (1)


То, что вы пытаетесь сделать, должно быть сделано с помощью JavaScript, вы можете сделать это только с сообщениями Django, но это неправильный путь.

Проверь это:

class BookForm(forms.ModelForm):
    has_sequel = forms.BooleanField(initial=True)

    class Meta:
        model = Book
        fields = ['author', 'length', 'has_sequel', 'sequel']

    class Media:
        js = ('book_form.js', )

    def clean(self):
        if self.cleaned_data['has_sequel'] and self.cleaned_data['sequel'] is None:
            raise ValidationError('You should indicate the sequel if the book has one.')


class BookView(FormView):
    template_name = 'book_form.html'
    form_class = BookForm
    success_url = '/done/'

Этот код включает Javascript с формой, таким образом, вы можете повторно использовать форму с собственным Javascript, код Javascript должен быть примерно таким (возможно, вам придется изменить javascript в зависимости от того, как вы печатаете форму в шаблоне):

$(document).ready(function() {
    $('#id_has_sequel')[0].addEventListener('change', (event) => {
        let sequelField = $('#id_sequel').parents('p');
        if (event.target.checked) {
            sequelField.show();
        } else {
            sequelField.hide();
        }
    })
});

И шаблон должен быть примерно таким:

{% load static %}

<head>
    <title>Book form</title>

    <script src="{% static 'jquery-3.4.1.min.js' %}"></script>
    {{ form.media }}
</head>

<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Send message">
</form>

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать, но пытаться сделать это без Javascript — не лучший подход. Столько же вы найдете какой-то виджет Django, который также будет использовать Javascript.

person Hagyn    schedule 20.07.2019