Django'网站'模型 - 'SITE_ID = 1'是什么和为什么?

问题描述 投票:33回答:5

我正在尝试使用Sites模型的Django。

我不太明白为什么qazxsw poi应该是qazxsw poi。

在文档中:

django_site数据库表中当前站点的ID(整数)。这样可以使应用程序数据挂钩到特定站点,单个数据库可以管理多个站点的内容。

为什么SITE_ID?什么是SITE_ID = 1?这在文档中没有明确解释。

让我们说,我有1和其他一些子域名,如current sitewww.somecoolsite.com

我想根据域名呈现不同的内容。

我的问题是,或更好,是:

  1. 我是否必须将所有这些域添加到DB中的www.wow.coolsite.com表中?
  2. 如果是这样,我应该如何在设置中设置www.awesome.coolsite.com?我是否必须设置像SitesSITE_ID等所有的ID?
  3. SITE_ID = 1SITE_ID = 2有什么关系?

我在这里有点困惑。

我想,每个网站(例如current site)应该是一个单独的django项目,以便他们可以拥有自己的settings.py?在每个settings.py中,我将从Sites表中设置该页面的id?但是有很多django项目对我来说也没有意义。

django django-sites
5个回答
27
投票

Django是由一组在报纸上开发的脚本创建的,用于在多个域上发布内容;使用一个单一的内容库。

这就是“站点”模块的用武之地。它的目的是标记要为不同域显示的内容。

在以前版本的django中,SITE_ID = 1脚本自动将www.wow.coolsite.com应用程序添加到startproject,当你执行django.contrib.sitesINSTALLED_APPS时,由于这是第一个站点,它的ID是syncdb,而这就是设置的来源。

请记住,从1.6开始,默认情况下不启用此框架。所以,如果你需要它,你必须a default site with the URL example.com was added to your database

1设置为您的项目设置默认站点。所以,如果你enable it,这是它将使用的那个。

因此,要为不同的域配置应用程序:

  1. SITE_ID
  2. 将默认站点从don't specify a site更改为您的默认域。您可以从django shell或管理员执行此操作。
  3. 将要向其发布内容的其他网站添加到网站应用程序。同样,您可以像任何其他应用程序或管理员一样从django shell执行此操作。
  4. 在对象Enable the sites framework中向站点模型添加外键
  5. 添加站点管理器example.com

现在,当您要过滤默认网站或特定网站的内容时:

site = models.ForeignKey(Site)

on_site = CurrentSiteManager()有一整套的例子。


14
投票

如果Django的默认SiteAdmin包含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 字段中的id字段,那么事情会更容易理解。

为此,您可以重新定义SiteAdmin(在您的应用中的任何位置,但我建议您使用admin.py或者您的urls.py),如下所示:

documentation

包含此代码段后,每个“站点”的ID将显示在管理列表的第一列中,并在表单内显示为只读字段。这些'id'字段是您需要用作SITE_ID的字段:

list_display

这个概念是每个不同的站点在不同的应用程序服务器实例中运行,使用不同的yourdomain_settings.py启动,然后包含base_settings.py以及其余的常见配置。

这些yourdomain_settings.py中的每一个都将定义自己的SITE_ID和所有其他不同的settings.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) 对于该域名。

进一步说明:modified admin page showing Site records' id确实需要define a DJANGO_SETTINGS_MODULE environment variable pointing to that specific yourdomain_settings.py file才能使用。如果您的代码没有代码,则可以使用get_current_site(request),但是在运行的应用程序服务器的设置中需要正确定义的SITE_ID。


6
投票

这在网站框架的request中有所介绍:

为了在生产中为不同的站点提供服务,您需要为每个SITE_ID创建一个单独的设置文件(可能从公共设置文件导入以避免重复共享设置),然后为每个站点指定相应的DJANGO_SETTINGS_MODULE。

但是如果您不想这样做,则根本不能设置Site.objects.get_current(),只需使用documentation根据视图中的域名查找当前站点:

SITE_ID

4
投票

这是一个迟到的答案,但对于有SITE_ID问题和网站问题的其他人。在数据库中,django有一个带有(id,domain,name)的django_site表。这是django存储SITE_ID的地方。我的数据库实际上是5,但我在设置中将其设置为SITE_ID = 1。

知道了,我现在可以回到数据库并清除它以回到零或使用数据库中的实际ID。


1
投票

这个get_current_site解释了它:

您需要为要添加的每个域创建单独的设置文件;每个人都需要自己的MEDIA_URL和其他设置。您还需要做两件事来确保一切正常,以便管理不同的网站:

在管理员中为每个域创建一个新的Site对象,并将该站点的ID作为SITE_ID放入其设置文件中,以便Django知道数据库中的哪个站点对应于此设置文件。

在原始站点的设置文件(ID为1的设置文件)中,将其他站点的设置文件添加到ADMIN_FOR设置,让Django知道管理应用程序的这一个实例将处理所有站点。

此外,如果你想弄清楚如何修改模型和设置视图你可以看看这个链接: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

© www.soinside.com 2019 - 2024. All rights reserved.