Nella mia app django alimentata c'è solo un caso ovvio dove può sorgere "IntegrityError".
Quindi, come posso rilevare quell'errore e visualizzare un messaggio utilizzando i modelli?Django: Catching Integrity Error e visualizzazione di un messaggio personalizzato utilizzando il modello
risposta
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.
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.
Inserirlo nel middleware non si limita a rilevare l'errore nell'app, ma in tutte le app del progetto. –
@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" "" –
Le pistole non sparano alle persone ai piedi, le persone sparano persone nel piede. :-) –
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.
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
- 1. Begin Rescue not catching error
- 2. Python Error Catching & FTP
- 3. Utilizzando Django auth UserAdmin per un modello di utente personalizzato
- 4. Catching exceptions in django templates
- 5. Django personalizzato Salva modello
- 6. messaggio di visualizzazione django dopo il modulo POST inviare
- 7. Messaggio di eccezione personalizzato utilizzando JUnit assertEquals?
- 8. django m2m_changed con personalizzato tramite il modello
- 9. Visualizzazione di un modello LDA, utilizzando Python
- 10. Visualizzazione di un oggetto timedelta in un modello di Django
- 11. Visualizzazione di un grafico di Google Utilizzando Django
- 12. Django - modello standard di visualizzazione verbose_names e oggetti
- 13. Django - modello personalizzato semplice tag esempio
- 14. Messaggio di errore personalizzato utilizzando il portatore del passaporto
- 15. Problemi con il modello di messaggio personalizzato di convalida ad eliminazione diretta
- 16. come pulire correttamente il modello di visualizzazione?
- 17. Tag modello personalizzato Django che accetta un parametro booleano
- 18. Aggiunta della validazione del modello Django personalizzato
- 19. modello utente django e campo chiave primaria personalizzato
- 20. In Django, come posso ottenere il messaggio di un'eccezione?
- 21. Emissione tag modello django personalizzato su AppEngine
- 22. Cambio di password Django modulo di visualizzazione
- 23. personalizzato risparmiare metodo sul modello - Django
- 24. Catching 302 error e quindi reindirizzamento nel metodo di sincronizzazione backbone.js override
- 25. Campo di convalida e la visualizzazione di errore nel tipo di messaggio personalizzato wordpress
- 26. Convalida del campo modello Django senza modulo personalizzato
- 27. Django: personalizzazione del messaggio dopo il salvataggio di un modulo
- 28. Messaggio di errori migliori se manca il modello
- 29. Django uwsgi import error
- 30. django valore di elemento di visualizzazione modello o stringa vuota
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
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/). –
Grazie, ho aggiornato la risposta. – Joe