Модель сайтов "Django" - что такое и почему "SITE_ID = 1"?
Я пытаюсь работать с Sites
моделью Django.
Я не совсем понимаю, почему SITE_ID
должен быть SITE_ID = 1
.
в документах:
Идентификатор, как целое, текущего сайта в базе данных django_site Таблица. Это используется, чтобы данные приложения могли подключаться к конкретным сайты и одна база данных могут управлять контентом для нескольких сайтов.
почему 1
? что такое current site
? это не ясно объяснено в документах.
скажем, у меня есть www.somecoolsite.com
и некоторые другие поддомены, такие как www.wow.coolsite.com
и www.awesome.coolsite.com
Я хочу отображать другой контент в зависимости от имени домена.
мой вопрос, или лучше, следующие:
- Нужно ли добавлять все эти домены в таблицу
Sites
в БД?
- если да, как мне установить
SITE_ID
в настройках? Должен ли я устанавливать все идентификаторы типа SITE_ID = 1
, SITE_ID = 2
.. и т.д.?
- Что делает
current site
для SITE_ID = 1
?
Я немного смущен.
Я думал, что каждый сайт (например, www.wow.coolsite.com
) должен быть отдельным проектом django, чтобы они могли иметь свои собственные settings.py? и в каждом из этих параметров settings.py я установил идентификатор этой страницы из таблицы Sites? но тогда есть много проектов джанго, которые также не имеют для меня смысла.
Ответы
Ответ 1
Django был создан из набора сценариев, разработанных в газете для публикации контента на нескольких доменах; используя одну базу контента.
Здесь находится модуль "сайты". Его цель - отметить контент, отображаемый для разных доменов.
В предыдущих версиях django startproject
script автоматически добавило приложение django.contrib.sites
к INSTALLED_APPS
, а когда вы сделали syncdb
, в вашу базу данных был добавлен сайт по умолчанию с URL example.com
, и поскольку это был первый сайт, его идентификатор был 1
и тот, с которого происходит настройка.
Имейте в виду, что начиная с версии 1.6 эта структура не включена по умолчанию. Поэтому, если вам это нужно, вы должны включить его
Параметр SITE_ID
устанавливает сайт по умолчанию для вашего проекта. Итак, если вы не указываете сайт, это тот, который он будет использовать.
Итак, чтобы настроить приложение для разных доменов:
- Включить инфраструктуру сайтов
- Измените сайт по умолчанию с
example.com
на любой ваш домен по умолчанию. Вы можете сделать это из оболочки django или из администратора.
- Добавьте другие сайты, для которых вы хотите публиковать контент в приложении для сайтов. Опять же, вы можете сделать это из оболочки django, как и любое другое приложение или из администратора.
- Добавить внешний ключ в модель сайта в объекте
site = models.ForeignKey(Site)
- Добавить менеджер сайта
on_site = CurrentSiteManager()
Теперь, когда вы хотите фильтровать контент для сайта по умолчанию или определенного сайта:
foo = MyObj.on_site.all() # Filters site to whatever is `SITE_ID`
foo = MyObj.objects.all() # Get all objects, irrespective of what site
# they belong to
документация содержит полный набор примеров.
Ответ 2
Это описано в документации к структуре сайтов:
Чтобы обслуживать разные сайты в производственной среде, вы должны создать отдельный файл настроек с каждым SITE_ID (возможно, импорт из общего файла настроек, чтобы избежать дублирования общих настроек), а затем указать соответствующий DJANGO_SETTINGS_MODULE для каждого сайта.
Но если вы не хотите делать это таким образом, вы не можете вообще установить SITE_ID
и просто посмотреть текущий сайт на основе доменного имени в ваших представлениях, используя get_current_site
:
from django.contrib.sites.shortcuts import get_current_site
def my_view(request):
current_site = get_current_site(request)
if current_site.domain == 'foo.com':
# Do something
pass
else:
# Do something else.
pass
Ответ 3
Это было бы намного проще понять, если бы по умолчанию Django SiteAdmin включал поле id в поля list_display
.
Для этого вы можете переопределить SiteAdmin (в любом месте вашего приложения, но я бы порекомендовал ваш admin.py или, возможно, ваш urls.py) следующим образом:
from django.contrib import admin
from django.contrib.sites.models import Site
admin.site.unregister(Site)
class SiteAdmin(admin.ModelAdmin):
fields = ('id', 'name', 'domain')
readonly_fields = ('id',)
list_display = ('id', 'name', 'domain')
list_display_links = ('name',)
search_fields = ('name', 'domain')
admin.site.register(Site, SiteAdmin)
После включения этого фрагмента кода идентификатор для каждого "сайта" будет отображаться в первом столбце списка администраторов и внутри формы как поле только для чтения. Эти поля 'id' - это то, что вам нужно использовать как SITE_ID:
![modified admin page showing Site records' id]()
Концепция заключается в том, что каждый отдельный сайт работает в отдельном экземпляре сервера приложений, запускаемом с использованием другого yourdomain_settings.py, который затем включает base_settings.py с остальной частью общей конфигурации.
Каждый из этих yourdomain_settings.py будет определять свой собственный SITE_ID и все другие различные параметры settings.py, которые должны выглядеть и отличаться друг от друга (статические ресурсы, шаблоны и т.д.), А затем вы будете определять переменную среды DJANGO_SETTINGS_MODULE, указывающую на этот конкретный файл yourdomain_settings.py при запуске экземпляра сервера приложений для этого домена.
Еще примечание: get_current_site(request)
нуждается request
будет доступен для его работы. Если в вашем коде его нет, вы можете использовать Site.objects.get_current()
который, однако, будет нуждаться в SITE_ID, правильно определенном в настройках запущенного сервера приложений.
Ответ 4
Это поздний ответ, но для всех, у кого есть проблемы с SITE_ID и проблемы с сайтом.
Внутри базы данных django имеет таблицу django_site с (id, domain, name). Здесь django хранит SITE_ID. Mine была фактически 5 в базе данных, но я установил ее в SITE_ID = 1 в настройках.
Зная, что теперь я могу вернуться к базе данных и очистить ее, чтобы вернуться к нулю или использовать фактический идентификатор в базе данных.
Ответ 5
Эта ссылка объясняет это:
Вы захотите создать отдельные файлы настроек для каждого добавляемого домена; каждому из них понадобится собственный MEDIA_URL и другие настройки. Вы также хотите сделать две вещи, чтобы убедиться, что все работает правильно для администрирования различных сайтов:
Создайте новый объект Site в вашем администраторе для каждого домена и поместите идентификатор этого сайта в его файл настроек как SITE_ID, чтобы Django знал, какой сайт в базе данных соответствует этому файлу настроек.
В файле настроек вашего исходного сайта (с идентификатором 1) добавьте файлы настроек других сайтов в настройку ADMIN_FOR, чтобы Django знал, что этот единственный экземпляр приложения администратора будет обрабатывать все сайты.
Кроме того, если вы хотите выяснить, как модифицировать модели и настроить представления, вы можете взглянуть по этой ссылке: https://django.cowhite.com/blog/managing-multiple-websites-with-a-common-database- в-Джанго-на-сайты-основа/