0

私はこのようなフォームを持っています:

class SearchForm(forms.Form):
    genus = forms.RegexField(
        regex=r'^[a-zA-Z]+$',
        required=False,
    )  
    species = forms.RegexField(
        regex=r'^[a-zA-Z]+$',
        required=False,
    )
    island_group = forms.ModelChoiceField(
        required=False,
        queryset=Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup'), 

island_groupモデルオブジェクトを返していないため、フォームはフィールドの検証に失敗しました。values_list個別のエントリを取得するには、 を返す必要があります。このフォームにはもう少し多くの機能があるため、モデル フォームを使用したくありません。

私の質問は次のとおりです。フォームを検証するための最良の方法は何ですか?

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

4

2 に答える 2

0

saveメソッドをオーバーライドしないのはなぜですか:実際に保存する前に検証関数を呼び出しますか?

于 2012-04-20T14:09:43.087 に答える
0

私は同じ問題を抱えていました。私の解決策は、ModelChoiceField の代わりに ChoiceField を使用することです。ユーザーにモデル インスタンスを選択させたくないので、これは理にかなっていると思いますが、1 つのテーブル列全体で異なる属性値と同じ属性が複数のモデル インスタンスに対応している可能性があります。

class SearchForm(forms.Form):
    # get the distinct attributes from one column
    entries = Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup')
    # change the entries to a valid format for choice field
    locality_choices = [(e, e) for e in entries]
    # the actual choice field
    island_group = forms.ChoiceField(
        required=False,
        choices=locality_choices)

このように、Django に組み込まれているバリデーションは、まさに私たちが望んでいることを実行します。つまり、1 つの列から可能なすべての属性のセットのメンバーが選択されたかどうかをチェックします。

于 2016-04-14T14:14:39.720 に答える