Использование пользовательского класса, полученного из django.contrib.admin.AdminSite
для сайта администратора проекта, без необходимости написания пользовательского регистрационного кода для регистрации моделей в новом классе. Когда я использую сторонние приложения с их собственными моделями, я бы не стал редактировать пользовательский регистрационный код только потому, что модели были добавлены или удалены из этих приложений.
Вы должны переключить экземпляр, созданный с помощью класса по умолчанию, используемого для сайта администратора, на свой собственный экземпляр, созданный с вашим собственным классом до django.contrib.admin
'autodiscover
функция вызывается. Я делаю это:
Наличие приложения, которое будет выполнять переключение. (Я использую свое приложение для конкретного проекта под названием core
для своих собственных целей.)
Два варианта:
Django 1.6 до 1.9: Используйте __init__
приложения для выполнения переключения. В Django 1.8 вы получите предупреждение об устаревании из-за изменений в Django 1.9, указанных ниже. Обратите внимание, что этот метод будет работать также с 1.9, потому что модули Django, загруженные с помощью кода, показанного ниже, были изменены в 1.9, чтобы они больше не загружали модели. Когда я использую этот метод, мой core/__init__.py
файл содержит:
from django.contrib import admin
from django.contrib.admin import sites
class MyAdminSite(admin.AdminSite):
pass
mysite = MyAdminSite()
admin.site = mysite
sites.site = mysite
Django 1.9 и более: использует конфигурацию приложения приложения для выполнения переключения. Начиная с Django 1.9, в примечаниях к выпуску говорится :
Все модели должны быть определены внутри установленного приложения или объявлены явные метки app_label. Кроме того, невозможно импортировать их до загрузки их приложения. В частности, невозможно импортировать модели внутри корневого пакета приложения.
Я предпочитаю ограничивать импорт, который я делаю на корневом уровне, чтобы избежать риска загрузки моделей. В то время как в версии 1.9 с использованием метода __init__
, описанного выше, будет работать , невозможно сказать, будет ли 1.10 или более поздняя версия вносить изменения, которые вызовут проблемы.
Когда я использую этот метод, core/__init__.py
устанавливает default_app_config = "core.apps.DefaultAppConfig"
, и у меня есть core/apps.py
, подобный этому:
from django.apps import AppConfig
class DefaultAppConfig(AppConfig):
name = 'core'
def ready(self):
from django.contrib import admin
from django.contrib.admin import sites
class MyAdminSite(admin.AdminSite):
pass
mysite = MyAdminSite()
admin.site = mysite
sites.site = mysite
Хотя этот метод можно использовать с версиями 1.7 и 1.8, он немного рискованно использовать его с этими версиями. См. Примечания ниже.
Размещение этого приложения раньше, чем , чем django.contrib.admin
, в списке INSTALLED_APPS
. (Это абсолютно необходимо для 1.7 и более поздних версий. В более ранних версиях Django он мог бы работать нормально, даже если приложение более позднее, чем django.contrib.admin
. Однако см. Примечания ниже.)
Приложение, которое выполняет переключение, должно действительно быть первым приложением в списке INSTALLED_APPS
, чтобы минимизировать вероятность того, что что-то еще получит значение site
из django.contrib.admin
до того, как будет выполнено переключение. Если другому приложению удастся получить это значение до того, как будет выполнено переключение, то у этого другого приложения будет ссылка на старый сайт. Веселье наверняка наступит.
Приведенный выше метод не будет работать хорошо, если два приложения пытаются установить свой собственный новый класс сайта администратора по умолчанию. Это должно быть обработано на индивидуальной основе.
Вполне возможно, что будущий релиз Django может сломать этот метод.
Для версии до 1.9 я предпочел использовать __init__
для переключения сайтов с использованием конфигурации приложения, поскольку документация об инициализации указывает, что метод ready()
конфигураций приложения называется относительно поздно. Между моментом загрузки модуля приложения и вызовом ready()
моделей загружаются, и в некоторых случаях это может означать, что модуль получил значение site
из django.contrib.admin
до того, как ready
называется. Чтобы минимизировать риск, у меня есть код приложения __init__
для переключения.
Я полагаю, что риск, существовавший в версиях 1.7 и 1.8 и которого я избежал, используя __init__
для выполнения переключения сайта как можно раньше, не существует в 1.9. Всем запрещается загружать модули до загрузки всех приложений. Таким образом, переключение в обратном вызове ready
первого приложения, указанного в INSTALLED_APPS
, должно быть безопасным. Я обновил большой проект до 1.9 и без проблем использовал метод конфигурации приложения.
Почему питание устройства не поступает без драйвера?
USB-порты всегда запитаны, когда компьютер включен, а управляющее программное обеспечение USB не обнаружило превышения допустимого тока.
Всегда ли требуется драйвер, чтобы порт USB начал подавать питание?
Нет, порт USB всегда требуется для подачи питания на устройство, иначе устройство никогда не сможет инициировать соединение.
Или это так. это устройство, специально созданное так, чтобы не брать заряд, если его не запускает какая-то программная процедура?
Это может быть сложно. Чтобы соответствовать спецификации USB, устройство не может потреблять более нескольких мА, пока оно не будет зарегистрировано в компьютере.
Однако почти каждый компьютер позволяет USB-порту потреблять полные 500 мА (и более), прежде чем оно отключит питание .
Устройство, которое вы перезарядка приятна тем, что не потребляет значительную мощность, пока компьютер не даст разрешения.
Написание программного обеспечения не поможет, устройство должно зарегистрироваться на шине USB, что лучше всего будет сделано с помощью драйвера.
Однако , зарядное устройство этого не делает. Вероятно, он закоротил две линии передачи данных USB-штекера вместе, что сигнализирует USB-устройству о том, что оно не подключено к компьютеру и может потреблять 500 мА без ожидания.
Возьмите удлинительный кабель USB, отрежьте куртку и закоротите вместе линии данных (зеленую и желтую, иногда) на конце, идущем к USB-устройству, и оставьте их обрезанными, не касаясь чего-либо на конце, идущем к ПК, и оставьте провод чтения и черный провод питания подключенными.
Это может сработать. Если нет, разберите зарядное устройство и выясните, что это?
Похоже, это зависит от платформы. В Linux порты USB всегда включены, а в Windows - нет. Накопители со светодиодами отключаются при демонтаже в Windows, но в Linux они продолжают гореть. В руководстве к моему мобильному телефону написано, что он не может быть заряжен от компьютера, но я регулярно это делаю на своей Linux-машине, я думаю, это потому, что у них нет драйвера, а окна не включаются без него.
Вы пробовали подключить его к «тупому» USB-порту - как тот, что на автомобильное зарядное устройство? Эти порты являются чистой мощностью и не создают сеть USB. Я думаю.
Если у вас нет технических характеристик оборудования от производителя, я думаю, вам не повезло. Вы можете попробовать обратное проектирование драйвера, чтобы увидеть, что он делает, но я ожидаю, что будет дешевле и проще просто купить драйвер с кроссплатформенными драйверами или зарядить без драйвера.