在我的django驱动的应用程序中,只有一个明显的情况可能会出现“IntegrityError” 那么,我如何捕获该错误并使用模板显示消息?
答案 0 :(得分:136)
只需使用try and catch。
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ênn Vie,您应该使用e.__cause__
,as described here。
答案 1 :(得分:10)
如果您使用CreateView mixin使用基于类的视图,那么您将尝试"尝试"调用超类的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
等来提高输出效果。
答案 2 :(得分:3)
最简单的解决方案:编写实现process_exception
的中间件,该中间件仅捕获IntegrityError并返回带有渲染模板的HttpResponse,并确保此中间件位于默认错误处理中间件之后,因此之前调用它(cf {{3更多)。
现在,如果我是你,我不会假设“只有一个明显的情况可能会出现”IntegrityError“,所以我强烈建议你记录异常(并发送电子邮件提醒)中间件。
答案 3 :(得分:1)
我会用ModelForm验证它。例如:
你有模特:
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之前,您将收到验证错误。 “类别已存在”消息将显示在模板
中的表单中答案 4 :(得分:0)
我这样做了
from django.db import IntegrityError
from django.shortcuts import render
from .models import Person
from .forms import PersonForm
class PersonView(View):
def get(self, request):
pd = PersonForm()
return render(request, "app1/my_form.html", context={ 'form': pd })
def post(self, request):
pd = PersonForm(request.POST)
if pd.is_valid():
name = pd.cleaned_data['name']
age = pd.cleaned_data['age']
height = pd.cleaned_data['height']
p = Person()
p.name = name
p.age = age
p.height = height
try:
p.save()
except IntegrityError as e:
e = 'this data already exists in the database'
return render(request, "app1/my_form.html", context={ 'form': pd, 'e': e})
context = {
'person': {
'name': name,
'age': age,
'height': height,
},
'form': pd
}
else:
print("Form is invalid")
context = { 'form': pd }
return render(request, "app1/my_form.html", context=context)
在模板中,我可以{{e}}
访问错误答案 5 :(得分:-1)
只需导入IntegrityError
从django.db导入IntegrityError
就是这样。