簡體   English   中英

Django向導表單中的條件表單字段

[英]Conditional Form Field in Django wizard form

我在django中使用向導表單。 我想創建一個表單字段,只有當其他表單字段的答案標記為“是”時,否則我不想要這個新的表單字段。 我怎樣才能做到這一點 ?
我已經嘗試了一些與此相關的其他答案,但是大多數答案都說明了如何標記字段是否需要但是我只想在其他字段的答案為“是”時顯示該字段

帶有條件問題的Django表單向導

在下面的代碼中我想顯示字段“Pool2”僅當字段“Pool”的答案標記為“是”否則我不想要該字段。 基本上我想在用戶的房子里有游泳池的情況下在游泳池“Pool2”中獲得游泳池的一些細節。

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],
            })

你要做的事情必須用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的情況下這樣做,這不是一個好方法。 你會發現一些將使用Javascript的Django小部件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM