1

Djangoフォームに少し問題があります。基本的に、私は 2 つのフォームを持っています。1 つは自由語検索で、もう 1 つはフィルターです。用語のフィールドは、ユーザーがフィルタを選択していない場合にのみ必須です。私はこのようなものを持っています(ただし、同じクラスに複数のフィルターがあります):

    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 フォームに渡し、required の値を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 を追加する必要があります。

于 2013-03-12T11:56:59.693 に答える