2012-07-02 12 views

risposta

99

Basta provare a cercare.

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

Se si desidera è possibile utilizzare il messaggio nel modello.

EDIT

Grazie per Jill-Jênn Vie, si dovrebbe usare e.__cause__, as described here.

+0

Grazie, non sono riuscito a capire perché "da MySQLdb import IntegrityError" non stava facendo il trucco. Lo stack di chiamate sembrava mostrare che era la libreria a sollevare l'errore, eppure in qualche modo viene spostato su django.db. Grr. – Julian

+1

Come indicato nella [documentazione della v1.6] (https://docs.djangoproject.com/en/1.6/ref/exceptions/#database-exceptions), 'e .__ causa__' è preferito, come per [PEP 3134] (http://legacy.python.org/dev/peps/pep-3134/). –

+0

Grazie, ho aggiornato la risposta. – Joe

3

soluzione più semplice: scrivere un middleware attuazione process_exception che cattura solo IntegrityError e restituisce un HttpResponse con il modello reso, e assicurarsi che questo middleware è dopo l'errore di default la gestione del middleware così è chiamato prima (cfr https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception per più).

Ora, se fossi in te, non darei per scontato una cosa come "c'è solo un caso ovvio dove può sorgere" IntegrityError ", quindi ti consiglio vivamente di registrare l'eccezione (e inviare avvisi via email) in il tuo middleware.

+0

Inserirlo nel middleware non si limita a rilevare l'errore nell'app, ma in tutte le app del progetto. –

+0

@ChrisWesseling: Totalmente d'accordo, è per questo che ho detto che "non vorrei assumere una cosa del genere" c'è solo un caso ovvio dove può sorgere "IntegrityError" "" –

+1

Le pistole non sparano alle persone ai piedi, le persone sparano persone nel piede. :-) –

5

Se stai usando una vista di classe-based con il mixin CreateView, ti consigliamo di "provare" la chiamata alla form_valid della superclasse, ad esempio:

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

È possibile utilizzare un modello, render_to_response ecc. per rendere l'output più bello, ovviamente.

1

Vorrei convalidarlo con ModelForm. Per esempio:

You got modello:

class Manufacturer(models.Model): 
    name = models.CharField(default='', max_length=40, unique=True) 

E 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 questo caso, quando si invia nome univoco. Riceverai l'errore di convalida prima di IntegrityError. Il messaggio "La categoria esiste già" verrà visualizzato nel modulo nel modello

Problemi correlati