У моїй програмі, що працює від django, є лише один очевидний випадок, коли може виникнути "IntegrityError".
Отже, як я можу виявити цю помилку та відобразити повідомлення за допомогою шаблонів?
У моїй програмі, що працює від 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ênn Vie , вам слід скористатися e.__cause__
, як описано тут .
Якщо ви використовуєте представлення на основі класу з CreateView
mixin, вам потрібно буде try
викликати суперклас 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
Звичайно, ви можете скористатися шаблоном тощо.
Найпростіше рішення: напишіть реалізацію проміжного програмного забезпечення, process_exception
яке вловлює лише IntegrityError і повертає HttpResponse із вашим відтвореним шаблоном, і переконайтеся, що це проміжне програмне забезпечення перебуває після того, як за замовчуванням обробляється проміжне програмне забезпечення, тому воно викликається раніше (див. Https://docs.djangoproject.com/en / dev / topics / http / middleware / # процес-виняток для отримання додаткової інформації).
Зараз на вашому місці я б не припускав такого поняття, як "існує лише один очевидний випадок, коли може виникнути" IntegrityError "", тому я настійно рекомендую вам реєструвати виняток (і надсилати сповіщення електронною поштою) у проміжне програмне забезпечення.
Я б перевірив це за допомогою 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. Повідомлення "Категорія вже існує" відображатиметься у вашій формі у шаблоні
Я зробив це так
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}}
Просто імпортуйте IntegrityError
from django.db import IntegrityError
і використовувати його всередині try / Osim
try:
//Do what is needed to be done
except IntegrityError as e:
//return what is supposed to be returned
Дякую @Soren Я щойно відредагував свою відповідь