Django 的 ModelForm unique_together 验证

标签 django validation modelform

我有一个看起来像这样的 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 没有验证 Solutionunique_together 约束,因此它返回一个 IntegrityError 试图保存表单时。我知道我可以使用 validate_unique 手动检查这一点,但我想知道是否有任何方法可以在表单验证中捕获它并自动返回表单错误。

谢谢。

最佳答案

我通过覆盖 ModelForm 的 validate_unique() 方法解决了同样的问题:


def validate_unique(self):
    exclude = self._get_validation_exclusions()
    exclude.remove('problem') # allow checking against the missing attribute

    try:
        self.instance.validate_unique(exclude=exclude)
    except ValidationError, e:
        self._update_errors(e.message_dict)

现在我总是确保表单上未提供的属性仍然可用,例如instance=Solution(problem=some_problem) 在初始化器上。

关于Django 的 ModelForm unique_together 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141030/

相关文章:

javascript - 验证可以添加或删除字段的动态表单

python - Django ModelForm Imagefield 上传

django - 在 django 中创建了一个模型,缺少主键

HTML 5 验证不工作

python - 在 Django View 中访问表单字段作为属性

python - 无法使用 Django ModelForm 进行模型绑定(bind)

django - 南 : Why creating a new empty migration when pulling in other developer's model changes?

django.utils.timezone.now 在默认 TimeField 中返回 UTC

python - 加载数据时 Django 中出现 Unicode 错误

python - CELERY 4.0.2 没有登录文件