我对Django表单有点问题。基本上,我有两种形式,一种是免费术语搜索,另一种是一些过滤器。仅当用户未选择过滤器时,才需要该术语的字段。 我有这样的东西(但在同一个类中有更多的过滤器):
class Term(forms.Form):
terms = forms.CharField(
label='Term',
required=True, # but false if the filters is selected
error_messages={'required': 'Please enter at least one search term'},
widget=TextInput(attrs={
'class':'textEntry',
'placeholder': 'Enter search'}))
class Filter(forms.Form):
filter = forms.ModelChoiceField(
choices = [1,2, 3],
label = "Filter",
required = False)
我到处搜索,但没有找到任何结果。你有什么主意吗?谢谢。
答案 0 :(得分:1)
在实例化时,您需要将filter
传递给Term表单,然后适当地设置terms
所需的值。我已稍微修改了这些名称,以便更加区分您的表单类。
# forms.py
class TermForm(forms.Form):
def __init__(self, *args, **kwargs):
filter = kwargs.pop('filter', None)
super(self, TermForm).__init__(*args, **kwargs)
if filter:
self.fields['terms'].error_messages = {
'required': 'Please enter at least one search term'
}
else:
self.fields['terms'].required = False
terms = forms.CharField(
label='Term',
widget=TextInput(attrs={
'class': 'textEntry',
'placeholder': 'Enter search'}))
# views.py, assuming Django 1.4.x+
from django.shortcuts import render
from your_app.forms import TermForm, FilterForm
def a_view(request):
filter_form = FilterForm(request.POST or None)
if request.method == 'POST' and filter_form.is_valid():
term_form = TermForm(request.POST or None,
filter_form.cleaned_data.get('filter')
if term_form.is_valid():
# do something
return render(request, 'a-template.html',
{'filter_form': filter_form, 'term_form': term_form})
所有字段都是自动需要的,除非您专门设置它们,这就是为什么__init__
覆盖中的逻辑可能看起来倒退的原因。如果您需要在选择filter
时直观地指示该字段是必需的,则需要添加一些JavaScript来执行此操作。