0

イベント(ソフトボールゲーム)をスケジュールし、より大きなチーム名簿からゲーム名簿を作成できるモデルを設計しようとしています。

class Game(models.Model):
DateTime = models.DateTimeField()
opponent = models.CharField(max_length = 50, default="TBD")
players = models.ManyToManyField(Player, limit_choices_to={'id__in': Player.objects.filter(active='True')},blank=True)

ここまでは順調ですね。ただし、プレーヤーの多対多フィールドにカスタム検証を追加して、ゲーム名簿が、とりわけ、名簿の最小サイズと最大サイズに関するリーグルールに準拠するようにします。

次のclean()メソッドを呼び出すと、ValueErrorが返されます(多対多の関係を使用するには、「Game」インスタンスに主キー値が必要です)。

def clean(self, *args, **kwargs):
    from django.core.exceptions import ValidationError
    #self.save()
    players_count = self.players.count()
    # Don't allow rosters with fewer than 9 players
    if players_count < 9:
        raise ValidationError('Rosters must have at least 9 players')

コメントアウトされたself.saveを挿入すると、バリデーターは機能しますが、ゲームのエントリが複数になります。

私はこれに不慣れです-これは私の最初の非チュートリアルのDjangoプロジェクトです-ですから、かなり単純な答えがあると思います。私はこことDjangoのドキュメントをざっと見て、有望に見えるいくつかのことを試しましたが、何も機能しませんでした。

4

1 に答える 1

0

clean メソッドでは、検証チェックを行いたいだけです。したがって、そもそも保存するのは悪い考えです。したがって、フォーム オブジェクトから、players フィールドの値を取得し、検証を実行できます。フォームの clean メソッドをオーバーライドするときは、cleaned_data を忘れずに返してください。

def clean(self, *args, **kwargs):
    from django.core.exceptions import ValidationError
    players = self.cleaned_data.get('players', [])
    players_count = len(players):
    # Don't allow rosters with fewer than 9 players
    if players_count < 9:
        raise ValidationError('Rosters must have at least 9 players')
    return self.cleaned_data
于 2012-12-17T00:02:43.850 に答える