python - with - Django: Catching Integrity Error y mostrando un mensaje personalizado usando la plantilla




how to use django with python (4)

En mi aplicación django powered solo hay un caso obvio en el que puede surgir "IntegrityError".
Entonces, ¿cómo puedo detectar ese error y mostrar un mensaje usando plantillas?


La solución más sencilla: escribir un middleware que implemente process_exception que solo capte IntegrityError y devuelva una HttpResponse con su plantilla representada, y asegúrese de que este middleware esté después del middleware que maneja el error predeterminado para que se llame antes (cf https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception para obtener más información).

Ahora bien, si yo fuera usted, no asumiría algo como "solo hay un caso obvio en el que puede surgir" IntegrityError ", por lo que le recomiendo encarecidamente que registre la excepción (y envíe alertas por correo electrónico) en su middleware.


Lo hice así

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)

en la plantilla, puedo acceder al erroe como {{e}}


Si está utilizando vistas basadas en clases con la mezcla de CreateView, querrá "probar" la llamada a form_valid de la superclase, por ejemplo:

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!")

Puede usar una plantilla, render_to_response , etc. para hacer que la salida sea más agradable, por supuesto.


Solo usa try y 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})

Si lo deseas, puedes usar el mensaje en tu plantilla.

EDITAR

Gracias por Jill-Jênn Vie , deberías usar e.__cause__ , como se describe aquí .





django