Django:捕获完整性错误并使用模板显示自定义消息

在我的Django驱动的应用程序中,只有一个明显的情况是“IntegrityError”可能出现。
那么,如何捕获这个错误并使用模板显示消息?

只要使用尝试和捕捉。

from django.db import IntegrityError from django.shortcuts import render_to_response try: # code that produces error except IntegrityError as e: return render_to_response("template.html", {"message": e.message}) 

如果你想要的话,你可以使用你的模板中的消息。

编辑

感谢Jill-JênnVie ,你应该使用e.__cause__ , 如下所述 。

如果你在CreateView混合中使用基于类的视图,你需要尝试调用超类的form_valid,例如:

 from django.db import IntegrityError ... class KumquatCreateView(CreateView): model = Kumquat form_class = forms.KumquatForm ... def form_valid(self, form): ... try: return super(KumquatCreateView, self).form_valid(form) except IntegrityError: return HttpResponse("ERROR: Kumquat already exists!") 

当然,你可以使用模板, render_to_response等来使输出更好。

最简单的解决scheme:编写一个实现process_exception的中间件,该中间件只捕获IntegrityError并返回一个HttpResponse与你的渲染模板,并确保这个中间件在默认的error handling中间件之后,所以在之前调用它(cf https://docs.djangoproject.com/ en / dev / topics / http / middleware /#process-exception for more)。

现在,如果我是你,我不会假设“只有一个”IntegrityError“可能出现的明显情况,所以我强烈build议你在中间件中loggingexception(并发送电子邮件警报)。

我将使用ModelForm进行validation。 例如:

你有型号:

 class Manufacturer(models.Model): name = models.CharField(default='', max_length=40, unique=True) 

和ModelForm:

 class ManufacturerForm(forms.ModelForm): def clean(self): cleaned_data = super(ManufacturerForm, self).clean() name = cleaned_data.get('name') if Manufacturer.objects.filter(name=name).exists(): raise forms.ValidationError('Category already exists') class Meta: model = Manufacturer 

在这种情况下,当您提交唯一的名称。 在IntegrityError之前您将得到validation错误。 “类别已存在”信息将显示在模板中的表单中