#27084: Admin site does not listen to database routers when adding objects
-------------------------------+-------------------------------------
     Reporter:  Jibodeah       |      Owner:  nobody
         Type:  Bug            |     Status:  new
    Component:  contrib.admin  |    Version:  1.10
     Severity:  Normal         |   Keywords:  admin, database, router
 Triage Stage:  Unreviewed     |  Has patch:  0
Easy pickings:  0              |      UI/UX:  0
-------------------------------+-------------------------------------
 == Steps to reproduce ==

 1. Use django-admin to start a new project. `django-admin startproject
 bugtest`
 2. In bugtest/settings.py rename the 'default' entry in DATABASES to
 'foobar'
     a. (also add a dummy 'default' entry which is an empty dict)


 {{{
 #!python
 DATABASES = {
     'default': {},
     'foobar': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
     }
 }
 }}}


 3. Run migrations on foobar. `./manage.py migrate --database foobar`
 4. Add a router that unconditionally maps read and write to foobar.


 {{{
 #!python
 import threading

 class Router(object):
     def db_for_read(self, model, **hints):
         database = 'foobar'
         print("Told thread {} to use {}".format(threading.get_ident(),
 database))
         return database

     def db_for_write(self, model, **hints):
         return self.db_for_read(model, **hints)
 }}}


 5. Create a superuser on foobar. `./manage.py createsuperuse --database
 foobar`
 6. Run the server and navigate to /admin, login with the superuser.
 7. Click on any 'add' link to be taken to any page to add a instance of a
 model.

 == Expected Results ==

 The page for adding an instance of a model shows up and can be used to add
 models to the foobar database.

 == Actual Results ==
 The following error is raised:

 {{{
 Traceback (most recent call last):
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/core/handlers/exception.py", line 39, in inner
     response = get_response(request)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/core/handlers/base.py", line 187, in _get_response
     response = self.process_exception_by_middleware(e, request)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/core/handlers/base.py", line 185, in _get_response
     response = wrapped_callback(request, *callback_args,
 **callback_kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/contrib/admin/options.py", line 544, in wrapper
     return self.admin_site.admin_view(view)(*args, **kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/utils/decorators.py", line 149, in _wrapped_view
     response = view_func(request, *args, **kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func
     response = view_func(request, *args, **kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/contrib/admin/sites.py", line 211, in inner
     return view(request, *args, **kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/contrib/admin/options.py", line 1509, in add_view
     return self.changeform_view(request, None, form_url, extra_context)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/utils/decorators.py", line 67, in _wrapper
     return bound_func(*args, **kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/utils/decorators.py", line 149, in _wrapped_view
     response = view_func(request, *args, **kwargs)
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/utils/decorators.py", line 63, in bound_func
     return func.__get__(self, type(self))(*args2, **kwargs2)
   File "/usr/lib64/python3.5/contextlib.py", line 29, in inner
     with self._recreate_cm():
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/db/transaction.py", line 158, in __enter__
     if not connection.get_autocommit():
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/db/backends/base/base.py", line 365, in get_autocommit
     self.ensure_connection()
   File "/home/jibodeah/.virtualenvs/test/lib/python3.5/site-
 packages/django/db/backends/dummy/base.py", line 21, in complain
     raise ImproperlyConfigured("settings.DATABASES is improperly
 configured. "
 django.core.exceptions.ImproperlyConfigured: settings.DATABASES is
 improperly configured. Please supply the ENGINE value. Check settings
 documentation for more details.
 }}}

 Implying that the admin site is trying to use the `default` database,
 ignoring the router's suggestion.

--
Ticket URL: <https://code.djangoproject.com/ticket/27084>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.8d7ce8359059797ac8bfb61b8852fc4d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to