Вопрос по django, python – Django: Catching Integrity Error и показ настраиваемого сообщения с использованием шаблона

57

В моем приложении с поддержкой django есть только один очевидный случай, когда & quot; IntegrityError & quot; может возникнуть.
Итак, как я могу поймать эту ошибку и отобразить сообщение с помощью шаблонов?

Ваш Ответ

6   ответов
3

process_exception это только перехватывает IntegrityError и возвращает HttpResponse с вашим отрендеренным шаблоном, и убедитесь, что это промежуточное ПО находится после промежуточного ПО обработки ошибок по умолчанию, поэтому оно вызывается раньше (см.https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception для большего).

Теперь, если бы я был вами, я бы не стал предполагать, что «есть только один очевидный случай, когда« IntegrityError » может возникнуть & quot ;, поэтому я настоятельно рекомендую вам регистрировать исключение (и отправлять оповещения по электронной почте) в промежуточном программном обеспечении.

Оружие не стреляет в людей в ногу, люди стреляют в людей в ногу. :-)
Поместив его в промежуточное ПО, вы поймете ошибку не только в приложении, но и во всех приложениях в проекте.
Я бы не назвал это самым простым решением, но это полезная альтернатива, о которой нужно знать. Благодарю.
@ChrisWesseling: Полностью согласен, поэтому я упомянул, что «я бы не предполагал такую вещь, как», есть только один очевидный случай, когда «IntegrityError»; может возникнуть & quot; & quot;
@ChrisWesseling: да, верно.
9

iew, вы захотите "попробовать" вызов суперкласса 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 и т.д., чтобы сделать вывод лучше, конечно.

131

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 & N xie Vie, вы должны использоватьe.__cause__, как описано здесь.

Если вы не получили сообщение, попробуйте это: e.args
Спасибо, я не могу понять, почему & quot; из MySQLdb импортировать IntegrityError & quot; не делал трюк. Похоже, стек вызовов показал, что библиотека вызвала ошибку, но каким-то образом она была перемещена в django.db. Grr.
Как указано вdocs of v1.6, e.__cause__ является предпочтительным, согласноPEP 3134.
Спасибо, я обновил ответ.
e.message не работал для меня, но e.args [1] сделал работу
-1


из django.db импортировать IntegrityError
Вот и все.

1

Вы получили модель:

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. «Категория уже существует» сообщение будет показано в вашей форме в шаблоне

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}}

Похожие вопросы