Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/env python
- """
- stack overflow question for django
- Question was 'How to share database errors with django admin'
- the part is the answer the second part is what the person said
- took to get it to work"""
- # first part 'Answer'
- from django.contrib import admin
- from django import forms
- from django.contrib.admin.options import csrf_protect_m, IS_POPUP_VAR
- from django.utils.translation import ugettext as _
- from django.utils.encoding import force_text
- # for nonfield errors to show correctly
- from django.forms.forms import NON_FIELD_ERRORS
- from .models import TestModel
- class TestModelAdmin(admin.ModelAdmin):
- def save_model(self, request, obj, form, change):
- raise Exception('test exception')
- @csrf_protect_m
- def add_view(self, request, form_url='', extra_context=None):
- try:
- return super(TestModelAdmin, self).add_view(request, form_url, extra_context)
- except Exception as e:
- pass
- # mimic parent class on error
- model = self.model
- opts = model._meta
- ModelForm = self.get_form(request)
- formsets = []
- inline_instances = self.get_inline_instances(request, None)
- form = ModelForm(request.POST, request.FILES)
- form.is_valid()
- # make faked nonfield error
- form.errors[NON_FIELD_ERRORS] = form.error_class([e.message])
- # We may handle exceptions here (just to save indentation)
- adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
- self.get_prepopulated_fields(request),
- self.get_readonly_fields(request),
- model_admin=self)
- media = self.media + adminForm.media
- inline_admin_formsets = []
- for inline, formset in zip(inline_instances, formsets):
- fieldsets = list(inline.get_fieldsets(request))
- readonly = list(inline.get_readonly_fields(request))
- prepopulated = dict(inline.get_prepopulated_fields(request))
- inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, \
- fieldsets, prepopulated, readonly, model_admin=self)
- inline_admin_formsets.append(inline_admin_formset)
- media = media + inline_admin_formset.media
- context = {
- 'title': _('Add %s') % force_text(opts.verbose_name),
- 'adminform': adminForm,
- 'is_popup': IS_POPUP_VAR in request.REQUEST,
- 'media': media,
- 'inline_admin_formsets': inline_admin_formsets,
- 'errors': helpers.AdminErrorList(form, formsets),
- 'app_label': opts.app_label,
- 'preserved_filters': self.get_preserved_filters(request),
- }
- context.update(extra_context or {})
- return self.render_change_form(request, context, form_url=form_url, add=True)
- admin.site.register(TestModel, TestModelAdmin)
- """
- part 2 response
- from django.contrib.admin import ModelAdmin
- from django.db import DatabaseError, IntegrityError
- from django.contrib import messages
- class ShowValidationAdmin(ModelAdmin):
- def add_view(self, request, form_url='', extra_context=None):
- try:
- return super(ShowValidationAdmin, self).add_view(self, request, form_url, extra_context)
- except (IntegrityError, DatabaseError) as e:
- request.method = 'GET'
- messages.error(request, e.message)
- return super(ShowValidationAdmin, self).add_view(self, request, form_url, extra_context)
- def change_view(self, request, object_id, form_url='', extra_context=None):
- try:
- return super(ShowValidationAdmin, self).change_view(request, object_id, form_url, extra_context)
- except (IntegrityError, DatabaseError) as e:
- request.method = 'GET'
- messages.error(request, e.message)
- return super(ShowValidationAdmin, self).change_view(request, object_id, form_url, extra_context)
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement