Django 向导表单中的条件表单字段
Conditional Form Field in Django wizard form
我在 Django 中使用向导表单。只有当对其他表单域的回答被标记为 "yes" 时,我才想创建一个表单域,否则我不想要这个新的表单域。我该怎么做?
我已经尝试了一些与此相关的其他答案,但其中大部分都讲述了如何标记字段是否为必填项,但我只想在其他字段的答案为 "Yes"
时显示该字段
Django Form Wizard with Conditional Questions
在下面的代码中,我只想显示字段 "Pool2" 只有当对字段 "Pool" 的回答被标记为 "yes" 时,否则我不想要该字段。基本上,如果用户家中有游泳池,我想在字段 "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 的情况下尝试这样做并不是一个好的方法。同样,您会发现某种 Django 小部件也将使用 Javascript。
我在 Django 中使用向导表单。只有当对其他表单域的回答被标记为 "yes" 时,我才想创建一个表单域,否则我不想要这个新的表单域。我该怎么做?
我已经尝试了一些与此相关的其他答案,但其中大部分都讲述了如何标记字段是否为必填项,但我只想在其他字段的答案为 "Yes"
Django Form Wizard with Conditional Questions
在下面的代码中,我只想显示字段 "Pool2" 只有当对字段 "Pool" 的回答被标记为 "yes" 时,否则我不想要该字段。基本上,如果用户家中有游泳池,我想在字段 "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 的情况下尝试这样做并不是一个好的方法。同样,您会发现某种 Django 小部件也将使用 Javascript。