django - IntegrityError(错误)而不是 ValidationError(正确)
问题描述
Django 版本:3.1.5
Python版本:3.6.9
模型
class GoogleAnalytics(models.Model):
counter = models.SlugField(max_length=17,
null=False,
default="",
unique=True,
verbose_name="Counter")
tracking_code = models.TextField(null=False,
default="",
verbose_name="Tracking code",
validators=[validate_google_analytics_tracking_code])
形式
class CounterForm(forms.ModelForm):
"""
Validate if the value in counter field
really corresponds to the tracking code for this counter.
"""
def clean(self):
counter_manager = CounterManager()
if "GoogleAnalytics" in str(self.Meta.model):
counter_from_tracking = counter_manager.get_counter(self.cleaned_data['tracking_code'],
Counters.GOOGLE_ANALYTICS)
else:
assert "YandexMetrika" in str(self.Meta.model)
counter_from_tracking = counter_manager.get_counter(self.cleaned_data['tracking_code'],
Counters.YANDEX_METRIKA)
if self.cleaned_data['counter'] != counter_from_tracking:
raise ValidationError("Код не соответствует счетчику")
return self.cleaned_data
class Meta:
model = GoogleAnalytics
exclude = []
行政
class GoogleAnalyticsAdmin(admin.ModelAdmin):
form = CounterForm
admin.site.register(GoogleAnalytics, GoogleAnalyticsAdmin)
追溯
好吧,计数器字段的唯一约束有效。
但是我提取了一个验证错误而不是 IntegrityError。你能告诉我如何解决这个问题吗?
解决方案
我认为您的问题是您已经覆盖了 clean 方法并且您没有将其称为依赖项。因为清理您的超级模型表单会在点击并在数据库中写入新记录之前验证您的唯一约束。所以我认为将这一行添加super().clean()
到您的 clean 方法中应该可以解决您的问题。
def clean(self):
super().clean()
counter_manager = CounterManager()
if "GoogleAnalytics" in str(self.Meta.model):
counter_from_tracking = counter_manager.get_counter(self.cleaned_data['tracking_code'],
Counters.GOOGLE_ANALYTICS)
else:
assert "YandexMetrika" in str(self.Meta.model)
counter_from_tracking = counter_manager.get_counter(self.cleaned_data['tracking_code'],
Counters.YANDEX_METRIKA)
if self.cleaned_data['counter'] != counter_from_tracking:
raise ValidationError("Код не соответствует счетчику")
return self.cleaned_data
或者,如果您想在条件之前检查您的条件,super
您可以移动super().clean()
到您的清洁方法的最后一行。
推荐阅读
- java - 如何单独访问字符串中的两种不同数据类型?
- node.js - TypeError:无法读取未定义的属性“isPrivate”
- android - 如何在不更改电话语言的情况下更改片段的语言?
- angular - Firestore 云功能创建用户触发器不提供显示名称?
- machine-learning - 根据 F1 分数(在阈值 = 0.5 处计算)选择模型是否等同于根据精确召回曲线下的面积选择模型?
- node.js - 如何防止 Mocha 在测试文件之间保留要求缓存?
- java - Movesense 展示应用程序,我无法更改采样率
- python - 使用 CSV 文件中的列表创建嵌套字典
- php - 传递给 Pheanstalk\Job::__construct() 的参数 2 必须是字符串类型,给定 null
- ios - 通过共享 iCloud 文件夹在 OSX / iOS 版本的应用程序之间共享文件时出现问题