1

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

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

4

1 回答 1

1

当您实例化它时,您需要将其传递filter给您的 Term 表单,然后terms适当地设置 required 的值。我已经稍微修改了名称,以便您的表单类更容易区分。

# 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__覆盖中的逻辑可能看起来倒退的原因。如果您需要在选择 a 时直观地指示该字段是必需的,filter则需要添加一些 JavaScript 来执行此操作。

于 2013-03-12T11:56:59.693 回答