Django

Code

Changeset 7929

Show
Ignore:
Timestamp:
07/15/08 16:43:21 (4 months ago)
Author:
brosner
Message:

newforms-admin: Fixed #5374 -- Added validation for ModelAdmin? and InlineModelAdmin? options including tests. Thanks mrts for initial legwork.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/django/contrib/admin/sites.py

    r7825 r7929  
    88from django.utils.translation import ugettext_lazy, ugettext as _ 
    99from django.views.decorators.cache import never_cache 
     10from django.conf import settings 
    1011import base64 
    1112import cPickle as pickle 
     
    6667        If a model is already registered, this will raise AlreadyRegistered. 
    6768        """ 
     69        do_validate = admin_class and settings.DEBUG 
     70        if do_validate: 
     71            # don't import the humongous validation code unless required 
     72            from django.contrib.admin.validation import validate 
    6873        admin_class = admin_class or ModelAdmin 
    6974        # TODO: Handle options 
     
    7378            if model in self._registry: 
    7479                raise AlreadyRegistered('The model %s is already registered' % model.__name__) 
     80            if do_validate: 
     81                validate(admin_class, model) 
    7582            self._registry[model] = admin_class(model, self) 
    7683 
  • django/branches/newforms-admin/django/core/management/validation.py

    r7479 r7929  
    144144                        e.add(opts, "Reverse query name for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name)) 
    145145 
    146         # Check admin attribute. 
    147         if opts.admin is not None: 
    148             # prepopulated_fields 
    149             if not isinstance(opts.admin.prepopulated_fields, dict): 
    150                 e.add(opts, '"%s": prepopulated_fields should be a dictionary.' % f.name) 
    151             else: 
    152                 for field_name, field_list in opts.admin.prepopulated_fields.items(): 
    153                     if not isinstance(field_list, (list, tuple)): 
    154                         e.add(opts, '"%s": prepopulated_fields "%s" value should be a list or tuple.' % (f.name, field_name)) 
    155  
    156             # list_display 
    157             if not isinstance(opts.admin.list_display, (list, tuple)): 
    158                 e.add(opts, '"admin.list_display", if given, must be set to a list or tuple.') 
    159             else: 
    160                 for fn in opts.admin.list_display: 
    161                     try: 
    162                         f = opts.get_field(fn) 
    163                     except models.FieldDoesNotExist: 
    164                         if not hasattr(cls, fn): 
    165                             e.add(opts, '"admin.list_display" refers to %r, which isn\'t an attribute, method or property.' % fn) 
    166                     else: 
    167                         if isinstance(f, models.ManyToManyField): 
    168                             e.add(opts, '"admin.list_display" doesn\'t support ManyToManyFields (%r).' % fn) 
    169             # list_display_links 
    170             if opts.admin.list_display_links and not opts.admin.list_display: 
    171                 e.add(opts, '"admin.list_display" must be defined for "admin.list_display_links" to be used.') 
    172             if not isinstance(opts.admin.list_display_links, (list, tuple)): 
    173                 e.add(opts, '"admin.list_display_links", if given, must be set to a list or tuple.') 
    174             else: 
    175                 for fn in opts.admin.list_display_links: 
    176                     try: 
    177                         f = opts.get_field(fn) 
    178                     except models.FieldDoesNotExist: 
    179                         if not hasattr(cls, fn): 
    180                             e.add(opts, '"admin.list_display_links" refers to %r, which isn\'t an attribute, method or property.' % fn) 
    181                     if fn not in opts.admin.list_display: 
    182                         e.add(opts, '"admin.list_display_links" refers to %r, which is not defined in "admin.list_display".' % fn) 
    183             # list_filter 
    184             if not isinstance(opts.admin.list_filter, (list, tuple)): 
    185                 e.add(opts, '"admin.list_filter", if given, must be set to a list or tuple.') 
    186             else: 
    187                 for fn in opts.admin.list_filter: 
    188                     try: 
    189                         f = opts.get_field(fn) 
    190                     except models.FieldDoesNotExist: 
    191                         e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn) 
    192             # date_hierarchy 
    193             if opts.admin.date_hierarchy: 
    194                 try: 
    195                     f = opts.get_field(opts.admin.date_hierarchy) 
    196                 except models.FieldDoesNotExist: 
    197                     e.add(opts, '"admin.date_hierarchy" refers to %r, which isn\'t a field.' % opts.admin.date_hierarchy) 
    198  
    199146        # Check ordering attribute. 
    200147        if opts.ordering: 
     
    214161                    e.add(opts, '"ordering" refers to "%s", a field that doesn\'t exist.' % field_name) 
    215162 
    216         # Check core=True, if needed. 
    217         for related in opts.get_followed_related_objects(): 
    218             if not related.edit_inline: 
    219                 continue 
    220             try: 
    221                 for f in related.opts.fields: 
    222                     if f.core: 
    223                         raise StopIteration 
    224                 e.add(related.opts, "At least one field in %s should have core=True, because it's being edited inline by %s.%s." % (related.opts.object_name, opts.module_name, opts.object_name)) 
    225             except StopIteration: 
    226                 pass 
    227  
    228163        # Check unique_together. 
    229164        for ut in opts.unique_together: 
  • django/branches/newforms-admin/tests/regressiontests/modeladmin/models.py

    r7771 r7929  
    11# coding: utf-8 
     2from datetime import date 
     3 
    24from django.db import models 
    3 from datetime import date 
     5from django.contrib.auth.models import User 
    46 
    57class Band(models.Model): 
     
    2224    ), blank=True) 
    2325 
     26class ValidationTestModel(models.Model): 
     27    name = models.CharField(max_length=100) 
     28    slug = models.SlugField() 
     29    users = models.ManyToManyField(User) 
     30    state = models.CharField(max_length=2, choices=(("CO", "Colorado"), ("WA", "Washington"))) 
     31    is_active = models.BooleanField() 
     32    pub_date = models.DateTimeField() 
     33 
     34class ValidationTestInlineModel(models.Model): 
     35    parent = models.ForeignKey(ValidationTestModel) 
    2436 
    2537__test__ = {'API_TESTS': """ 
     
    227239>>> band.delete() 
    228240 
     241# ModelAdmin Option Validation ################################################ 
     242 
     243>>> from django.contrib.admin.validation import validate 
     244>>> from django.conf import settings 
     245 
     246# Ensure validation only runs when DEBUG = True 
     247 
     248>>> settings.DEBUG = True 
     249 
     250>>> class ValidationTestModelAdmin(ModelAdmin): 
     251...     raw_id_fields = 10 
     252>>> site = AdminSite() 
     253>>> site.register(ValidationTestModel, ValidationTestModelAdmin) 
     254Traceback (most recent call last): 
     255... 
     256ImproperlyConfigured: `ValidationTestModelAdmin.raw_id_fields` must be a list or tuple. 
     257 
     258>>> settings.DEBUG = False 
     259 
     260>>> class ValidationTestModelAdmin(ModelAdmin): 
     261...     raw_id_fields = 10 
     262>>> site = AdminSite() 
     263>>> site.register(ValidationTestModel, ValidationTestModelAdmin) 
     264 
     265# raw_id_fields 
     266 
     267>>> class ValidationTestModelAdmin(ModelAdmin): 
     268...     raw_id_fields = 10 
     269>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     270Traceback (most recent call last): 
     271... 
     272ImproperlyConfigured: `ValidationTestModelAdmin.raw_id_fields` must be a list or tuple. 
     273 
     274>>> class ValidationTestModelAdmin(ModelAdmin): 
     275...     raw_id_fields = ('non_existent_field',) 
     276>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     277Traceback (most recent call last): 
     278... 
     279ImproperlyConfigured: `ValidationTestModelAdmin.raw_id_fields` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     280 
     281>>> class ValidationTestModelAdmin(ModelAdmin): 
     282...     raw_id_fields = ('name',) 
     283>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     284Traceback (most recent call last): 
     285... 
     286ImproperlyConfigured: `ValidationTestModelAdmin.raw_id_fields[0]`, `name` must be either a ForeignKey or ManyToManyField. 
     287 
     288>>> class ValidationTestModelAdmin(ModelAdmin): 
     289...     raw_id_fields = ('users',) 
     290>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     291 
     292# fieldsets 
     293 
     294>>> class ValidationTestModelAdmin(ModelAdmin): 
     295...     fieldsets = 10 
     296>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     297Traceback (most recent call last): 
     298... 
     299ImproperlyConfigured: `ValidationTestModelAdmin.fieldsets` must be a list or tuple. 
     300 
     301>>> class ValidationTestModelAdmin(ModelAdmin): 
     302...     fieldsets = ({},) 
     303>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     304Traceback (most recent call last): 
     305... 
     306ImproperlyConfigured: `ValidationTestModelAdmin.fieldsets[0]` must be a list or tuple. 
     307 
     308>>> class ValidationTestModelAdmin(ModelAdmin): 
     309...     fieldsets = ((),) 
     310>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     311Traceback (most recent call last): 
     312... 
     313ImproperlyConfigured: `ValidationTestModelAdmin.fieldsets[0]` does not have exactly two elements. 
     314 
     315>>> class ValidationTestModelAdmin(ModelAdmin): 
     316...     fieldsets = (("General", ()),) 
     317>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     318Traceback (most recent call last): 
     319... 
     320ImproperlyConfigured: `ValidationTestModelAdmin.fieldsets[0][1]` must be a dictionary. 
     321 
     322>>> class ValidationTestModelAdmin(ModelAdmin): 
     323...     fieldsets = (("General", {}),) 
     324>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     325Traceback (most recent call last): 
     326... 
     327ImproperlyConfigured: `fields` key is required in ValidationTestModelAdmin.fieldsets[0][1] field options dict. 
     328 
     329>>> class ValidationTestModelAdmin(ModelAdmin): 
     330...     fieldsets = (("General", {"fields": ("non_existent_field",)}),) 
     331>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     332Traceback (most recent call last): 
     333... 
     334ImproperlyConfigured: `ValidationTestModelAdmin.fieldsets[0][1]['fields']` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     335 
     336>>> class ValidationTestModelAdmin(ModelAdmin): 
     337...     fieldsets = (("General", {"fields": ("name",)}),) 
     338>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     339 
     340# form 
     341 
     342>>> class FakeForm(object): 
     343...     pass 
     344>>> class ValidationTestModelAdmin(ModelAdmin): 
     345...     form = FakeForm 
     346>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     347Traceback (most recent call last): 
     348... 
     349ImproperlyConfigured: ValidationTestModelAdmin.form does not inherit from BaseModelForm. 
     350 
     351# filter_vertical 
     352 
     353>>> class ValidationTestModelAdmin(ModelAdmin): 
     354...     filter_vertical = 10 
     355>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     356Traceback (most recent call last): 
     357... 
     358ImproperlyConfigured: `ValidationTestModelAdmin.filter_vertical` must be a list or tuple. 
     359 
     360>>> class ValidationTestModelAdmin(ModelAdmin): 
     361...     filter_vertical = ("non_existent_field",) 
     362>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     363Traceback (most recent call last): 
     364... 
     365ImproperlyConfigured: `ValidationTestModelAdmin.filter_vertical` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     366 
     367>>> class ValidationTestModelAdmin(ModelAdmin): 
     368...     filter_vertical = ("name",) 
     369>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     370Traceback (most recent call last): 
     371... 
     372ImproperlyConfigured: `ValidationTestModelAdmin.filter_vertical[0]` must be a ManyToManyField. 
     373 
     374>>> class ValidationTestModelAdmin(ModelAdmin): 
     375...     filter_vertical = ("users",) 
     376>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     377 
     378# filter_horizontal 
     379 
     380>>> class ValidationTestModelAdmin(ModelAdmin): 
     381...     filter_horizontal = 10 
     382>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     383Traceback (most recent call last): 
     384... 
     385ImproperlyConfigured: `ValidationTestModelAdmin.filter_horizontal` must be a list or tuple. 
     386 
     387>>> class ValidationTestModelAdmin(ModelAdmin): 
     388...     filter_horizontal = ("non_existent_field",) 
     389>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     390Traceback (most recent call last): 
     391... 
     392ImproperlyConfigured: `ValidationTestModelAdmin.filter_horizontal` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     393 
     394>>> class ValidationTestModelAdmin(ModelAdmin): 
     395...     filter_horizontal = ("name",) 
     396>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     397Traceback (most recent call last): 
     398... 
     399ImproperlyConfigured: `ValidationTestModelAdmin.filter_horizontal[0]` must be a ManyToManyField. 
     400 
     401>>> class ValidationTestModelAdmin(ModelAdmin): 
     402...     filter_horizontal = ("users",) 
     403>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     404 
     405# radio_fields 
     406 
     407>>> class ValidationTestModelAdmin(ModelAdmin): 
     408...     radio_fields = () 
     409>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     410Traceback (most recent call last): 
     411... 
     412ImproperlyConfigured: `ValidationTestModelAdmin.radio_fields` must be a dictionary. 
     413 
     414>>> class ValidationTestModelAdmin(ModelAdmin): 
     415...     radio_fields = {"non_existent_field": None} 
     416>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     417Traceback (most recent call last): 
     418... 
     419ImproperlyConfigured: `ValidationTestModelAdmin.radio_fields` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     420 
     421>>> class ValidationTestModelAdmin(ModelAdmin): 
     422...     radio_fields = {"name": None} 
     423>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     424Traceback (most recent call last): 
     425... 
     426ImproperlyConfigured: `ValidationTestModelAdmin.radio_fields['name']` is neither an instance of ForeignKey nor does have choices set. 
     427 
     428>>> class ValidationTestModelAdmin(ModelAdmin): 
     429...     radio_fields = {"state": None} 
     430>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     431Traceback (most recent call last): 
     432... 
     433ImproperlyConfigured: `ValidationTestModelAdmin.radio_fields['state']` is neither admin.HORIZONTAL nor admin.VERTICAL. 
     434 
     435>>> class ValidationTestModelAdmin(ModelAdmin): 
     436...     radio_fields = {"state": VERTICAL} 
     437>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     438 
     439# prepopulated_fields 
     440 
     441>>> class ValidationTestModelAdmin(ModelAdmin): 
     442...     prepopulated_fields = () 
     443>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     444Traceback (most recent call last): 
     445... 
     446ImproperlyConfigured: `ValidationTestModelAdmin.prepopulated_fields` must be a dictionary. 
     447 
     448>>> class ValidationTestModelAdmin(ModelAdmin): 
     449...     prepopulated_fields = {"non_existent_field": None} 
     450>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     451Traceback (most recent call last): 
     452... 
     453ImproperlyConfigured: `ValidationTestModelAdmin.prepopulated_fields` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     454 
     455>>> class ValidationTestModelAdmin(ModelAdmin): 
     456...     prepopulated_fields = {"slug": ("non_existent_field",)} 
     457>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     458Traceback (most recent call last): 
     459... 
     460ImproperlyConfigured: `ValidationTestModelAdmin.prepopulated_fields['non_existent_field'][0]` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     461 
     462>>> class ValidationTestModelAdmin(ModelAdmin): 
     463...     prepopulated_fields = {"users": ("name",)} 
     464>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     465Traceback (most recent call last): 
     466... 
     467ImproperlyConfigured: `ValidationTestModelAdmin.prepopulated_fields['users']` is either a DateTimeField, ForeignKey or ManyToManyField. This isn't allowed. 
     468 
     469>>> class ValidationTestModelAdmin(ModelAdmin): 
     470...     prepopulated_fields = {"slug": ("name",)} 
     471>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     472 
     473# list_display 
     474 
     475>>> class ValidationTestModelAdmin(ModelAdmin): 
     476...     list_display = 10 
     477>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     478Traceback (most recent call last): 
     479... 
     480ImproperlyConfigured: `ValidationTestModelAdmin.list_display` must be a list or tuple. 
     481 
     482>>> class ValidationTestModelAdmin(ModelAdmin): 
     483...     list_display = ('non_existent_field',) 
     484>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     485Traceback (most recent call last): 
     486... 
     487ImproperlyConfigured: `ValidationTestModelAdmin.list_display[0]` refers to `non_existent_field` that is neither a field, method or property of model `ValidationTestModel`. 
     488 
     489>>> class ValidationTestModelAdmin(ModelAdmin): 
     490...     list_display = ('users',) 
     491>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     492Traceback (most recent call last): 
     493... 
     494ImproperlyConfigured: `ValidationTestModelAdmin.list_display[0]`, `users` is a ManyToManyField which is not supported. 
     495 
     496>>> class ValidationTestModelAdmin(ModelAdmin): 
     497...     list_display = ('name',) 
     498>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     499 
     500# list_display_links 
     501 
     502>>> class ValidationTestModelAdmin(ModelAdmin): 
     503...     list_display_links = 10 
     504>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     505Traceback (most recent call last): 
     506... 
     507ImproperlyConfigured: `ValidationTestModelAdmin.list_display_links` must be a list or tuple. 
     508 
     509>>> class ValidationTestModelAdmin(ModelAdmin): 
     510...     list_display_links = ('non_existent_field',) 
     511>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     512Traceback (most recent call last): 
     513... 
     514ImproperlyConfigured: `ValidationTestModelAdmin.list_display_links[0]` refers to `non_existent_field` that is neither a field, method or property of model `ValidationTestModel`. 
     515 
     516>>> class ValidationTestModelAdmin(ModelAdmin): 
     517...     list_display_links = ('name',) 
     518>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     519Traceback (most recent call last): 
     520... 
     521ImproperlyConfigured: `ValidationTestModelAdmin.list_display_links[0]`refers to `name` which is not defined in `list_display`. 
     522 
     523>>> class ValidationTestModelAdmin(ModelAdmin): 
     524...     list_display = ('name',) 
     525...     list_display_links = ('name',) 
     526>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     527 
     528# list_filter 
     529 
     530>>> class ValidationTestModelAdmin(ModelAdmin): 
     531...     list_filter = 10 
     532>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     533Traceback (most recent call last): 
     534... 
     535ImproperlyConfigured: `ValidationTestModelAdmin.list_filter` must be a list or tuple. 
     536 
     537>>> class ValidationTestModelAdmin(ModelAdmin): 
     538...     list_filter = ('non_existent_field',) 
     539>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     540Traceback (most recent call last): 
     541... 
     542ImproperlyConfigured: `ValidationTestModelAdmin.list_filter[0]` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     543 
     544>>> class ValidationTestModelAdmin(ModelAdmin): 
     545...     list_filter = ('is_active',) 
     546>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     547 
     548# list_per_page 
     549 
     550>>> class ValidationTestModelAdmin(ModelAdmin): 
     551...     list_per_page = 'hello' 
     552>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     553Traceback (most recent call last): 
     554... 
     555ImproperlyConfigured: `ValidationTestModelAdmin.list_per_page` should be a integer. 
     556 
     557>>> class ValidationTestModelAdmin(ModelAdmin): 
     558...     list_per_page = 100 
     559>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     560 
     561# search_fields 
     562 
     563>>> class ValidationTestModelAdmin(ModelAdmin): 
     564...     search_fields = 10 
     565>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     566Traceback (most recent call last): 
     567... 
     568ImproperlyConfigured: `ValidationTestModelAdmin.search_fields` must be a list or tuple. 
     569 
     570# date_hierarchy 
     571 
     572>>> class ValidationTestModelAdmin(ModelAdmin): 
     573...     date_hierarchy = 'non_existent_field' 
     574>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     575Traceback (most recent call last): 
     576... 
     577ImproperlyConfigured: `ValidationTestModelAdmin.date_hierarchy` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     578 
     579>>> class ValidationTestModelAdmin(ModelAdmin): 
     580...     date_hierarchy = 'name' 
     581>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     582Traceback (most recent call last): 
     583... 
     584ImproperlyConfigured: `ValidationTestModelAdmin.date_hierarchy is neither an instance of DateField nor DateTimeField. 
     585 
     586>>> class ValidationTestModelAdmin(ModelAdmin): 
     587...     date_hierarchy = 'pub_date' 
     588>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     589 
     590# ordering 
     591 
     592>>> class ValidationTestModelAdmin(ModelAdmin): 
     593...     ordering = 10 
     594>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     595Traceback (most recent call last): 
     596... 
     597ImproperlyConfigured: `ValidationTestModelAdmin.ordering` must be a list or tuple. 
     598 
     599>>> class ValidationTestModelAdmin(ModelAdmin): 
     600...     ordering = ('non_existent_field',) 
     601>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     602Traceback (most recent call last): 
     603... 
     604ImproperlyConfigured: `ValidationTestModelAdmin.ordering[0]` refers to field `non_existent_field` that is missing from model `ValidationTestModel`. 
     605 
     606>>> class ValidationTestModelAdmin(ModelAdmin): 
     607...     ordering = ('?', 'name') 
     608>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     609Traceback (most recent call last): 
     610... 
     611ImproperlyConfigured: `ValidationTestModelAdmin.ordering` has the random ordering marker `?`, but contains other fields as well. Please either remove `?` or the other fields. 
     612 
     613>>> class ValidationTestModelAdmin(ModelAdmin): 
     614...     ordering = ('name',) 
     615>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     616 
     617# list_select_related 
     618 
     619>>> class ValidationTestModelAdmin(ModelAdmin): 
     620...     list_select_related = 1 
     621>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     622Traceback (most recent call last): 
     623... 
     624ImproperlyConfigured: `ValidationTestModelAdmin.list_select_related` should be a boolean. 
     625 
     626>>> class ValidationTestModelAdmin(ModelAdmin): 
     627...     list_select_related = False 
     628>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     629 
     630# save_as 
     631 
     632>>> class ValidationTestModelAdmin(ModelAdmin): 
     633...     save_as = 1 
     634>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     635Traceback (most recent call last): 
     636... 
     637ImproperlyConfigured: `ValidationTestModelAdmin.save_as` should be a boolean. 
     638 
     639>>> class ValidationTestModelAdmin(ModelAdmin): 
     640...     save_as = True 
     641>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     642 
     643# save_on_top 
     644 
     645>>> class ValidationTestModelAdmin(ModelAdmin): 
     646...     save_on_top = 1 
     647>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     648Traceback (most recent call last): 
     649... 
     650ImproperlyConfigured: `ValidationTestModelAdmin.save_on_top` should be a boolean. 
     651 
     652>>> class ValidationTestModelAdmin(ModelAdmin): 
     653...     save_on_top = True 
     654>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     655 
     656# inlines 
     657 
     658>>> from django.contrib.admin.options import TabularInline 
     659 
     660>>> class ValidationTestModelAdmin(ModelAdmin): 
     661...     inlines = 10 
     662>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     663Traceback (most recent call last): 
     664... 
     665ImproperlyConfigured: `ValidationTestModelAdmin.inlines` must be a list or tuple. 
     666 
     667>>> class ValidationTestInline(object): 
     668...     pass 
     669>>> class ValidationTestModelAdmin(ModelAdmin): 
     670...     inlines = [ValidationTestInline] 
     671>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     672Traceback (most recent call last): 
     673... 
     674ImproperlyConfigured: `ValidationTestModelAdmin.inlines[0]` does not inherit from BaseModelAdmin. 
     675 
     676>>> class ValidationTestInline(TabularInline): 
     677...     pass 
     678>>> class ValidationTestModelAdmin(ModelAdmin): 
     679...     inlines = [ValidationTestInline] 
     680>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     681Traceback (most recent call last): 
     682... 
     683ImproperlyConfigured: `model` is a required attribute of `ValidationTestModelAdmin.inlines[0]`. 
     684 
     685>>> class SomethingBad(object): 
     686...     pass 
     687>>> class ValidationTestInline(TabularInline): 
     688...     model = SomethingBad 
     689>>> class ValidationTestModelAdmin(ModelAdmin): 
     690...     inlines = [ValidationTestInline] 
     691>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     692Traceback (most recent call last): 
     693... 
     694ImproperlyConfigured: `ValidationTestModelAdmin.inlines[0].model` does not inherit from models.Model. 
     695 
     696>>> class ValidationTestInline(TabularInline): 
     697...     model = ValidationTestInlineModel 
     698>>> class ValidationTestModelAdmin(ModelAdmin): 
     699...     inlines = [ValidationTestInline] 
     700>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     701 
     702# fields 
     703 
     704>>> class ValidationTestInline(TabularInline): 
     705...     model = ValidationTestInlineModel 
     706...     fields = 10 
     707>>> class ValidationTestModelAdmin(ModelAdmin): 
     708...     inlines = [ValidationTestInline] 
     709>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     710Traceback (most recent call last): 
     711... 
     712ImproperlyConfigured: `ValidationTestInline.fields` must be a list or tuple. 
     713 
     714>>> class ValidationTestInline(TabularInline): 
     715...     model = ValidationTestInlineModel 
     716...     fields = ("non_existent_field",) 
     717>>> class ValidationTestModelAdmin(ModelAdmin): 
     718...     inlines = [ValidationTestInline] 
     719>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     720Traceback (most recent call last): 
     721... 
     722ImproperlyConfigured: `ValidationTestInline.fields` refers to field `non_existent_field` that is missing from model `ValidationTestInlineModel`. 
     723 
     724# fk_name 
     725 
     726>>> class ValidationTestInline(TabularInline): 
     727...     model = ValidationTestInlineModel 
     728...     fk_name = "non_existent_field" 
     729>>> class ValidationTestModelAdmin(ModelAdmin): 
     730...     inlines = [ValidationTestInline] 
     731>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     732Traceback (most recent call last): 
     733... 
     734ImproperlyConfigured: `ValidationTestInline.fk_name` refers to field `non_existent_field` that is missing from model `ValidationTestInlineModel`. 
     735 
     736>>> class ValidationTestInline(TabularInline): 
     737...     model = ValidationTestInlineModel 
     738...     fk_name = "parent" 
     739>>> class ValidationTestModelAdmin(ModelAdmin): 
     740...     inlines = [ValidationTestInline] 
     741>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     742 
     743# extra 
     744 
     745>>> class ValidationTestInline(TabularInline): 
     746...     model = ValidationTestInlineModel 
     747...     extra = "hello" 
     748>>> class ValidationTestModelAdmin(ModelAdmin): 
     749...     inlines = [ValidationTestInline] 
     750>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     751Traceback (most recent call last): 
     752... 
     753ImproperlyConfigured: `ValidationTestInline.extra` should be a integer. 
     754 
     755>>> class ValidationTestInline(TabularInline): 
     756...     model = ValidationTestInlineModel 
     757...     extra = 2 
     758>>> class ValidationTestModelAdmin(ModelAdmin): 
     759...     inlines = [ValidationTestInline] 
     760>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     761 
     762# max_num 
     763 
     764>>> class ValidationTestInline(TabularInline): 
     765...     model = ValidationTestInlineModel 
     766...     max_num = "hello" 
     767>>> class ValidationTestModelAdmin(ModelAdmin): 
     768...     inlines = [ValidationTestInline] 
     769>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     770Traceback (most recent call last): 
     771... 
     772ImproperlyConfigured: `ValidationTestInline.max_num` should be a integer. 
     773 
     774>>> class ValidationTestInline(TabularInline): 
     775...     model = ValidationTestInlineModel 
     776...     max_num = 2 
     777>>> class ValidationTestModelAdmin(ModelAdmin): 
     778...     inlines = [ValidationTestInline] 
     779>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     780 
     781# formset 
     782 
     783>>> class FakeFormSet(object): 
     784...     pass 
     785>>> class ValidationTestInline(TabularInline): 
     786...     model = ValidationTestInlineModel 
     787...     formset = FakeFormSet 
     788>>> class ValidationTestModelAdmin(ModelAdmin): 
     789...     inlines = [ValidationTestInline] 
     790>>> validate(ValidationTestModelAdmin, ValidationTestModel) 
     791Traceback (most recent call last): 
     792... 
     793ImproperlyConfigured: `ValidationTestInline.formset` does not inherit from BaseInlineFormset. 
     794 
    229795""" 
    230796}