In meiner Django-App gibt es nur einen offensichtlichen Fall, in dem "IntegrityError" auftreten kann.
Wie kann ich diesen Fehler abfangen und eine Nachricht mithilfe von Vorlagen anzeigen?
76
Verwenden Sie einfach 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})
Wenn Sie möchten, können Sie die Nachricht in Ihrer Vorlage verwenden.
BEARBEITEN
Vielen Dank für Jill-Jenn Vie , sollten Sie nutzen e.__cause__
, wie hier beschrieben .
e.__cause__
wird gemäß PEP 3134 bevorzugt .Wenn Sie mit dem
CreateView
Mixin klassenbasierte Ansichten verwenden , möchten Sie beispielsweisetry
die Oberklasse aufrufenform_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!")
Sie können
render_to_response
natürlich eine Vorlage usw. verwenden, um die Ausgabe zu verbessern.quelle
Einfachste Lösung: Schreiben Sie eine Middleware-Implementierung
process_exception
, die nur IntegrityError abfängt und eine HttpResponse mit Ihrer gerenderten Vorlage zurückgibt, und stellen Sie sicher, dass diese Middleware nach dem Standardfehler bei der Behandlung von Middleware liegt, sodass sie zuvor aufgerufen wird (siehe https://docs.djangoproject.com/de) / dev / topic / http / middleware / # Prozessausnahme für mehr).Wenn ich Sie wäre, würde ich nicht davon ausgehen, dass "es nur einen offensichtlichen Fall gibt, in dem" IntegrityError "auftreten kann". Ich empfehle daher dringend, die Ausnahme in Ihrer Middleware zu protokollieren (und E-Mail-Benachrichtigungen zu senden).
quelle
Ich würde es mit ModelForm validieren. Zum Beispiel:
Du hast Modell:
class Manufacturer(models.Model): name = models.CharField(default='', max_length=40, unique=True)
Und 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
In diesem Fall, wenn Sie einen eindeutigen Namen angeben. Vor IntegrityError wird ein Validierungsfehler angezeigt. Die Meldung "Kategorie existiert bereits" wird in Ihrem Formular in der Vorlage angezeigt
quelle
Ich habe es so gemacht
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)
in der vorlage kann ich als {{e}} auf den erroe zugreifen
quelle
Importieren Sie einfach IntegrityError
from django.db import IntegrityError
und benutze es in try / Except
try: //Do what is needed to be done except IntegrityError as e: //return what is supposed to be returned
Danke @Soren Ich habe gerade meine Antwort bearbeitet
quelle