Django:根据另一种形式动态更改表单要求

时间:2013-03-12 01:15:17

标签: python django forms

我对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)

我到处搜索,但没有找到任何结果。你有什么主意吗?谢谢。

1 个答案:

答案 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来执行此操作。