В моем приложении, основанном на django, есть только один очевидный случай, когда может возникнуть "IntegrityError".
Итак, как я могу поймать эту ошибку и отобразить сообщение с использованием шаблонов?
Django: ошибка целостности и отображение настраиваемого сообщения с использованием шаблона
Ответ 1
Просто используйте try и 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__
, как описано здесь.
Ответ 2
Если вы используете представления на основе классов с помощью MixView 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
и т.д., чтобы сделать вывод более приятным, конечно.
Ответ 3
Самое простое решение: напишите промежуточное программное обеспечение, реализующее process_exception
, которое только ловит IntegrityError и возвращает HttpResponse с вашим визуализированным шаблоном, и убедитесь, что это промежуточное программное обеспечение после промежуточного программного обеспечения обработки ошибок по умолчанию, поэтому оно вызывается раньше (cf https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception для более).
Теперь, если бы я был вами, я бы не стал предполагать, что "существует только один очевидный случай, когда может возникнуть" IntegrityError ", поэтому я настоятельно рекомендую вам регистрировать исключение (и отправлять оповещения по электронной почте) в вашем промежуточное программное обеспечение.
Ответ 4
Я бы подтвердил это с помощью 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. Сообщение "Категория уже существует" будет отображаться в вашей форме в шаблоне
Ответ 5
Я сделал это так
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}}
Ответ 6
Просто импортируйте IntegrityError
из django.db импортировать IntegrityError
Все это.