При использовании Django-tables2 с представлением на основе классов и базой данных не по умолчанию возникает ошибка "NameError: имя 'TypeError' не определено".

Я пытаюсь установить django-tables2 и следую рекомендациям в их docs. Однако, если я вызываю представление, оно выдает ошибку

File "/home/ubuntu/mysite/mysite_venv/lib/python3.8/site-packages/asgiref/local.py", line 94, in __del__
NameError: name 'TypeError' is not defined

Примечание: Насколько я смог понять, это сообщение об ошибке, к сожалению, встречается и в других контекстах, так как самая популярная тема посвящена проблеме конфигурации Apache. Я буду рад скорректировать заголовок для ясности, как только проблема будет понята кратко.

Django-tables2 должен получить доступ (только для чтения) к старой базе данных MySQL, которую я добавил за базой данных SQLite по умолчанию в settings.py (см. далее).

Мой polls/models.py:

from django.db import models
import datetime
from django.db import models
from django.utils import timezone

...

class Dashboard(models.Model):
    host = models.CharField(db_column='Host', max_length=255, blank=True, null=True)
    title = models.TextField(db_column='Title', blank=True, null=True)
    operation = models.CharField(db_column='Operation', max_length=255, blank=True, null=True)
    performedat = models.DateTimeField(db_column='PerformedAt', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'dashboard'

В случае, если это необходимо, базовая таблица в MySQL выглядит следующим образом:

c.execute('''CREATE TABLE dashboard(
            id INT PRIMARY KEY AUTO_INCREMENT,
            Host VARCHAR(255),
            Title TEXT,
            Operation VARCHAR(255),
            PerformedAt DATETIME);''')

Мой polls/views.py:

from django.shortcuts import render
from django.views.generic.list import ListView
from .models import Dashboard
from django.http import HttpResponse

class DashboardListView(ListView):
    model = Dashboard
    template_name = 'polls/dashboard.html'

Примечание: я убедился, что dashboard.html находится в mysite/polls/templates/polls.

Мой polls/urls.py:

from django.urls import path

from polls.views import DashboardListView, detail, accept, reject

urlpatterns = [
    # ex: /polls/
    path('', DashboardListView.as_view()),
    #ex: /polls/5/
    path('<int:question_id>/', detail, name='detail'),
    #ex: /polls/5/accept/
    path('<int:question_id>/accept/', accept, name='results'),
    # ex: /polls/5/deny/
    path('<int:question_id>/deny/', reject, name='reject'),
]

Мой polls/dbrouters.py:

from polls.models import Dashboard

class DashboardDBRouter:
    def db_for_read (self, model, **hints):
        if (model == Dashboard):
            # your model name as in settings.py/DATABASES
            return 'dashbaord'
        return None

Моя dashboard.html (просто использовал шаблон учебника):

{# polls/templates/polls/dashboard.html #}
{% load render_table from django_tables2 %}
<!doctype html>
<html>
    <head>
        <title>List of persons</title>
    </head>
    <body>
        {% render_table object_list %}
    </body>
</html>

Мой settings.py:

# Application definition

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_tables2',
]

DATABASE_ROUTERS = (
    'polls.dbrouters.DashboardDBRouter',
)

...

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'dashboard': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdatabase',
        'USER': 'my_username',
        'PASSWORD': 'my_password',
        'HOST': 'my_host',
        'PORT': '3306'
    },
}

Я заметил, что если я открою оболочку с python manage.py shell и просто вызову менеджер через Dashboard.objects.all(), я получу

django.utils.connection.ConnectionDoesNotExist: The connection 'dashbaord' doesn't exist.

В то время как если я вызываю Dashboard.objects.all().using(‘dashboard’), это, похоже, работает, поскольку я получаю

<QuerySet [<Dashboard: Dashboard object (1)>]>

Возможно ли, что что-то не так с моим маршрутизатором? Я думал, что он должен подключаться автоматически, если я правильно понял этот ответ.

Мое второе предположение: у меня еще нет большого опыта работы с Django и представлениями на основе классов, так что это может быть совершенно не так, но меня смущает, что ни моя модель, ни мое представление не содержат никаких утверждений, которые содержат какие-либо утверждения return или str(), хотя я нашел противоположные примеры здесь и здесь.

Я подумал, что это может быть проблемой, потому что это может объяснить ошибку в том смысле, что интерпретатор Python уничтожается до завершения процесса, потому что ничего не возвращается, как обсуждалось здесь (к сожалению, без четкого результата).

Я честно не знаю, куда двигаться дальше, любая помощь будет очень признательна.

В вашем написании dashbaord (должно быть dashboard) в routers.py:

допущена опечатка.
django.utils.connection.ConnectionDoesNotExist: 
   The connection 'dashbaord' doesn't exist.
                  ^^^^^^^^^^^
Вернуться на верх