Подтвердить что ты не робот

Модель сайтов "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? но тогда есть много проектов джанго, которые также не имеют для меня смысла.

4b9b3361

Ответ 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- в-Джанго-на-сайты-основа/