1. ホーム
  2. django

Django の ModelForm unique_together バリデーション

2023-12-05 07:24:36

質問事項

私は以下のようなDjangoのモデルを持っています。

class Solution(models.Model):
    '''
    Represents a solution to a specific problem.
    '''
    name = models.CharField(max_length=50)
    problem = models.ForeignKey(Problem)
    description = models.TextField(blank=True)
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ("name", "problem")

モデルを追加するためのフォームとして、以下のようなものを使っています。

class SolutionForm(forms.ModelForm):
    class Meta:
        model = Solution
        exclude = ['problem']

私の問題は SolutionForm が検証されないことです。 Solution 's unique_together の制約があるため IntegrityError を返します。私は validate_unique を使って手動でチェックできることは知っていますが、フォームのバリデーションでこれをキャッチして自動的にフォームエラーを返す方法はないかと考えていました。

ありがとうございます。

どのように解決するのですか?

フォームにクリーンメソッドを追加することで、ビューを修正することなく、この問題を解決することができました。

class SolutionForm(forms.ModelForm):
    class Meta:
        model = Solution
        exclude = ['problem']

    def clean(self):
        cleaned_data = self.cleaned_data

        try:
            Solution.objects.get(name=cleaned_data['name'], problem=self.problem)
        except Solution.DoesNotExist:
            pass
        else:
            raise ValidationError('Solution with this Name already exists for this problem')

        # Always return cleaned_data
        return cleaned_data

今ビューで必要なことは、実行する前にフォームに問題のあるプロパティを追加することだけです。 is_valid .