6

カスタムクリーンメソッドでいくつかのフィールドを検証したいと思います。

私はこれまでにこれを持っています:

class ProjectInfoForm(forms.Form):
    module = forms.ModelChoiceField(
        queryset=Module.objects.all(),
    )
    piece = forms.CharField(
        widget=forms.Select(),
        required=False,
    )
    span = forms.IntegerField(
        max_value=100,
        initial=48
    )
    max_span = forms.IntegerField(
        max_value=100,
        initial=0
    )


    def clean(self):
        span = self.cleaned_data['span']
        max_span = self.cleaned_data['max_span']
        piece = self.cleaned_data.['piece']

        # validate piece 
        try:
            Piece.objects.get(pk=m)
        except Piece.DoesNotExist:
            raise forms.ValidationError(
                'Illegal Piece selected!'
            )
            self._errors["piece"] = "Please enter a valid model"

        # validate spans
        if span > max_span:
            raise forms.ValidationError(
                'Span must be less than or equal to Maximum Span'
            )
            self._errors["span"] = "Please enter a valid span"
        return self.cleaned_data

ただし、これは、両方の句が無効になった場合にのみメッセージの1つを表示します。どうすればすべての無効なメッセージを取得できますか。また、フィールド固有のメッセージが表示されません-特定のフィールドに表示されるメッセージを含めるにはどうすればよいですか?

どんな助けでも大歓迎です。

4

4 に答える 4

6

エラーを保存し、メソッドが終了するまでエラーを発生させないでください。

def clean(self):
    span = self.cleaned_data['span']
    max_span = self.cleaned_data['max_span']
    piece = self.cleaned_data.['piece']
    error_messages = []

    # validate piece 
    try:
        Piece.objects.get(pk=m)
    except Piece.DoesNotExist:
        error_messages.append('Illegal Piece selected')
        self._errors["piece"] = "Please enter a valid model"

    # validate spans
    if span > max_span:
        error_messages.append('Span must be less than or equal to Maximum Span')
        self._errors["span"] = "Please enter a valid span"

    if len(error_messages):
        raise forms.ValidationError(' & '.join(error_messages))

    return self.cleaned_data
于 2012-12-12T18:05:33.213 に答える
1

この場合、カスタムのclean_FIELDNAMEメソッドを作成する必要があります。そうすれば、テンプレートで{{form.errors}}を使用するときに、フィールド中心の検証エラーを後でそのように表示できます。クリーンな方法は、複数のフィールドにまたがるロジックを検証するためのものです。上に投稿したリンクを見てください。djangoフォームの検証について知っておく必要のあることはすべてそこにあります。

于 2012-12-12T18:01:02.100 に答える
0

を使用しているために発生しますraise。コード内で次の2行に置き換えてみてください。

del self.cleaned_data['piece']

del self.cleaned_data['span']
于 2012-12-12T18:07:27.447 に答える
0

これはDjangoの新しいバージョンで変更されたようです(これは2.1以降で機能するようです):


from django import forms

class ContactForm(forms.Form):
    # Everything as before.
    ...

    def clean(self):
        cleaned_data = super().clean()
        cc_myself = cleaned_data.get("cc_myself")
        subject = cleaned_data.get("subject")

        if cc_myself and subject and "help" not in subject:
            msg = "Must put 'help' in subject when cc'ing yourself."
            self.add_error('cc_myself', msg)
            self.add_error('subject', msg)

https://docs.djangoproject.com/en/dev/ref/forms/validation/#raising-multiple-errorsに詳細があります。

于 2019-08-14T19:24:09.303 に答える