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

时间:2014-08-24 04:58:26

标签: django django-sites

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

我不太明白为什么SITE_ID应该是SITE_ID = 1

在文档中:

  

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

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

我想说,我有www.somecoolsite.com和其他一些子域名,例如www.wow.coolsite.comwww.awesome.coolsite.com

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

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

  1. 我是否必须将所有这些域添加到数据库中的Sites表中?
  2. 如果是,我该如何在设置中设置SITE_ID?我是否必须设置所有ID SITE_ID = 1SITE_ID = 2等等?
  3. current siteSITE_ID = 1有什么关系?
  4. 我在这里有点困惑。

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

5 个答案:

答案 0 :(得分:26)

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

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

在先前版本的django中,startproject脚本自动将django.contrib.sites应用程序添加到INSTALLED_APPS,当您执行syncdba default site with the URL example.com was added to your database时,这是第一个网站,其ID为1,这就是设置的来源。

请记住,从1.6开始,默认情况下不启用此框架。因此,如果您需要,您必须enable it

SITE_ID设置为您的项目设置默认网站。所以,如果你don't specify a site,这就是它将使用的那个。

所以要为不同的域配置你的应用程序:

  1. Enable the sites framework
  2. 将默认网站从example.com更改为您的默认网域。您可以从django shell或管理员执行此操作。
  3. 将要向其发布内容的其他网站添加到网站应用程序。同样,您可以像任何其他应用程序或管理员一样从django shell执行此操作。
  4. 在对象site = models.ForeignKey(Site)
  5. 中为站点模型添加外键
  6. 添加网站管理员on_site = CurrentSiteManager()
  7. 现在,当您要过滤默认网站或特定网站的内容时:

    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
    

    documentation有一整套示例。

答案 1 :(得分:10)

如果Django的默认SiteAdmin在list_display字段中包含id字段,那么事情会更容易理解。

要执行此操作,您可以重新定义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将显示在管理列表的第一列中,并在表单内显示为只读字段。这些'id'字段是您需要用作SITE_ID:

modified admin page showing Site records' id

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

每个yourdomain_settings.py都会定义自己的SITE_ID和所有其他不同的settings.py参数,这些参数需要查看并且彼此不同(静态资源,模板等),然后您{{3}启动该域的应用程序服务器实例时。

进一步说明:get_current_site(request)确实需要request才能使其正常运行。如果您的代码没有代码,则可以使用Site.objects.get_current(),但需要在正在运行的应用程序服务器设置中正确定义SITE_ID。

答案 2 :(得分:6)

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

  

为了服务于生产中的不同网站,您需要创建一个   使用每个SITE_ID单独设置文件(可能从a导入)   公共设置文件,以避免重复共享设置)然后   为每个站点指定适当的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 :(得分:4)

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

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

答案 4 :(得分:1)

link对其进行了解释:

  

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

     

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

     

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

此外,如果您想了解如何修改模型和设置视图,则可以查看以下链接: https://django.cowhite.com/blog/managing-multiple-websites-with-a-common-database-in-django-the-sites-framework/