Joh*_*eer 5 python django django-admin
使用 Django 1.4
当用户输入重复值时,我想捕获完整性错误。此时应用程序只显示默认的 Django 错误页面。(调试 = 真)
class Foo(models.Model):
name = models.Charfield(max_length=100, unique=True)
identifier = models.CharField(max_length=100, unique=True)
parent = models.ForeignKey("self", related_name="children")
bar = models.ForeignKey(Bar, related_name="foos")
Run Code Online (Sandbox Code Playgroud)
from django.core.exceptions import ValidationError
from django.db import IntegrityError
class FooAdmin(admin.ModelAdmin):
form = FooForm
search_fields = ['name']
list_display = ['name']
def save_model(self, request, obj, form, change):
try:
obj.save()
except IntegrityError as e:
raise ValidationError(e)
Run Code Online (Sandbox Code Playgroud)
class FooForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(FooForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields["parent"].queryset = Foo.objects.filter(bar=self.instance.bar)
def clean(self):
bar_identifier = self.cleaned_data.get("bar").identifier
parent = self.cleaned_data.get("parent")
if parent is not None:
parent_bar_identifier = parent.bar.identifier
if bar_identifier != parent_bar_identifier:
raise forms.ValidationError("Bar identifier should match parent Bar identifier")
return self.cleaded_data
Run Code Online (Sandbox Code Playgroud)
此时,我收到一个错误页面,显示 ValidationError 而不是 IntegrityError。(这是完全有道理的)
我如何才能正确捕获 IntegrityError 并将其显示在 Django 管理页面的顶部?
我注意到那里有一个表格来检查是否foo.parent.bar.identifier匹配foo.bar.identifier。
当我从 ViewAdmin 中删除表单时,错误处理按预期工作。
所以我想这里的问题是:如何在保存管理表单时检查父母是否匹配?
您不应该尝试在方法中处理这个问题save_model。管理视图期望该save_model方法成功,因此不处理完整性或验证错误。如果该save_model方法正在 raise IntegrityError,那么问题可能出在其他地方。
我认为你的问题是当你重写它时忘记调用父类的clean方法。这会阻止表单验证唯一字段。有关更多信息,请参阅文档中的警告。
class FooForm(forms.ModelForm):
def clean(self):
cleaned_data = super(FooForm, self).clean()
parent = cleaned_data.get("parent")
...
return cleaned_data
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3577 次 |
| 最近记录: |