MarkerDave
MarkerDave

Reputation: 355

Custom validation Django admin unknown field

I am trying to make a custom validation for the imageField in the admin panel, but I get the following error. There is nog field with the namen banner_image in the Event model class, but when I change field = ('banner_image',) to something else I get instead of "specified for Event" specified for EventBanner. most solutions I find for making a custom validation are for older versions of Django.

django.core.exceptions.FieldError: Unknown field(s) (banner_image) specified for Event. Check fields/fieldsets/exclude attributes of class EventAdmin.

app admin.py:

class BannerImageForm(forms.ModelForm):
   class Meta:
       model = EventBanner
       fields = ['banner_image',]

   def clean_banner_image(self):
       banner_image = self.cleaned_data['banner_image']
       if not banner_image:
           raise forms.ValidationError("No image!")
       else:
           w, h = get_image_dimensions(banner_image)
           if w != 1200:
               raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1200px" % w)
           if h != 200:
               raise forms.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
       return banner_image

class EventAdmin(admin.ModelAdmin):
    form = BannerImageForm
    list_display = ('event_name', 'event_start_date')
    formfield_overrides={
    models.TextField:{'widget':Textarea(attrs={'rows':15, 'cols':80})}
    }
admin.site.register(Event, EventAdmin)

app models.py:

class EventBanner(models.Model):
    event = models.OneToOneField(Event, unique=True)
    banner_image = models.ImageField(upload_to=get_image_path, blank=True, null=True)

    def clean(self):
        validate_only_one_instance(self)

TraceBack:

Environment:


Request Method: GET
Request URL: http://localhost:8000/admin/events/event/1/change/

Django Version: 1.10.4
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'organizations.apps.OrganizationsConfig',
 'news.apps.NewsConfig',
 'events.apps.EventsConfig',
 'bootstrap3',
 'django_forms_bootstrap',
 'registration']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware']



Traceback:

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in get_form
  642.             return modelform_factory(self.model, **defaults)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/forms/models.py" in modelform_factory
  548.     return type(form)(class_name, (form,), form_class_attrs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/forms/models.py" in __new__
  257.                 raise FieldError(message)

During handling of the above exception (Unknown field(s) (banner_image) specified for Event), another exception occurred:

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in wrapper
  544.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  57.         response = view_func(request, *args, **kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/sites.py" in inner
  211.             return view(request, *args, **kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in change_view
  1512.         return self.changeform_view(request, object_id, form_url, extra_context)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/usr/lib/python3.5/contextlib.py" in inner
  30.                 return func(*args, **kwds)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in changeform_view
  1438.         ModelForm = self.get_form(request, obj)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in get_form
  608.             fields = flatten_fieldsets(self.get_fieldsets(request, obj))

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in get_fieldsets
  298.         return [(None, {'fields': self.get_fields(request, obj)})]

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in get_fields
  597.         form = self.get_form(request, obj, fields=None)

File "/home/dave/Projecten/Web/Django/venv/lib/python3.5/site-packages/django/contrib/admin/options.py" in get_form
  646.                 % (e, self.__class__.__name__)

Exception Type: FieldError at /admin/events/event/1/change/
Exception Value: Unknown field(s) (banner_image) specified for Event. Check fields/fieldsets/exclude attributes of class EventAdmin.

Upvotes: 0

Views: 701

Answers (1)

Alasdair
Alasdair

Reputation: 308949

The form for EventAdmin must use the Event model. You get the error because BannerImageForm form uses the EventBanner model.

Create an EventBannerAdmin, and get your code working with that. Then, you could change it to an inline, and include the inline in the EventAdmin.

Upvotes: 1

Related Questions