При использовании 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.
^^^^^^^^^^^