我正在尝试使用Sites
Django模型。
我不太明白为什么SITE_ID
应该是SITE_ID = 1
。
在文档中:
django_site数据库中当前站点的ID(整数) 表。这用于使应用程序数据可以挂钩到特定的 站点和单个数据库可以管理多个站点的内容。
为什么1
?什么是current site
?这在文档中没有明确解释。
我想说,我有www.somecoolsite.com
和其他一些子域名,例如www.wow.coolsite.com
和www.awesome.coolsite.com
我想根据域名呈现不同的内容。
我的问题是,或更好,是:
Sites
表中? SITE_ID
?我是否必须设置所有ID SITE_ID = 1
,SITE_ID = 2
等等? current site
与SITE_ID = 1
有什么关系? 我在这里有点困惑。
我想,每个网站(例如www.wow.coolsite.com
)应该是一个单独的django项目,以便他们可以拥有自己的settings.py?在每个settings.py中,我将从Sites表中设置该页面的ID?但是有很多django项目对我来说也没有意义。
答案 0 :(得分:26)
Django是从报纸上开发的一组脚本创建的,用于在多个域上发布内容;使用一个单一的内容库。
这就是“网站”模块的用武之地。它的目的是标记要为不同域显示的内容。
在先前版本的django中,startproject
脚本自动将django.contrib.sites
应用程序添加到INSTALLED_APPS
,当您执行syncdb
,a 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,这就是它将使用的那个。
所以要为不同的域配置你的应用程序:
example.com
更改为您的默认网域。您可以从django shell或管理员执行此操作。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
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:
这个概念是每个不同的站点在不同的应用服务器实例中运行,使用不同的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/