Django';网站';模型-什么是以及为什么是';站点ID=1';?
我正在尝试使用Django的Django';网站';模型-什么是以及为什么是';站点ID=1';?,django,django-sites,Django,Django Sites,我正在尝试使用Django的站点模型 我不太明白为什么SITE\u ID应该是SITE\u ID=1 在文件中: django_站点数据库中当前站点的整数ID 桌子这是为了使应用程序数据可以挂接到特定的 站点和单个数据库可以管理多个站点的内容 为什么1?当前站点是什么?这在文件中没有明确解释 比如说,我有www.somecoolsite.com和其他一些子域,比如www.wow.coolsite.com和www.awesome.coolsite.com 我想根据域名呈现不同的内容 我的问题是,或
站点
模型
我不太明白为什么SITE\u ID
应该是SITE\u ID=1
在文件中:
django_站点数据库中当前站点的整数ID
桌子这是为了使应用程序数据可以挂接到特定的
站点和单个数据库可以管理多个站点的内容
为什么1
?当前站点是什么?这在文件中没有明确解释
比如说,我有www.somecoolsite.com
和其他一些子域,比如www.wow.coolsite.com
和www.awesome.coolsite.com
我想根据域名呈现不同的内容
我的问题是,或者更好,是:
站点表中李>
如果是,我应该如何在设置中设置SITE\u ID
?我是否必须设置所有ID,如SITE\u ID=1
,SITE\u ID=2
。。等等李>
当前站点
与站点_ID=1
有什么关系李>
我在这里有点困惑
我想,每个网站(例如www.wow.coolsite.com
)都应该是一个单独的django项目,这样他们就可以有自己的设置了。py?在每个settings.py中,我将从Sites表中设置该页面的id?但是还有很多django项目对我来说也毫无意义 Django是从一家报纸上开发的一组脚本创建的,用于在多个域上发布内容;使用单个内容库
这就是“站点”模块的用武之地。其目的是为不同的域标记要显示的内容
在django的早期版本中,startproject
脚本自动将django.contrib.sites
应用程序添加到INSTALLED_APPS
,当您执行syncdb
时,由于这是第一个站点,它的ID是1
,这就是设置的来源
请记住,从1.6开始,默认情况下不会启用此框架。所以如果你需要它,你必须
SITE\u ID
设置为项目设置默认站点。所以,如果你愿意,这就是它将使用的
因此,要为不同的域配置应用程序,请执行以下操作:
将默认站点从example.com
更改为您的默认域。您可以从django shell或从管理员处执行此操作
将要为其发布内容的其他网站添加到“网站”应用程序。同样,您可以像其他任何应用程序一样,从django shell或从管理员处执行此操作
将外键添加到对象中的站点模型Site=models.ForeignKey(Site)
在\u 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
有一套完整的示例。这是一个迟来的答案,但适用于存在站点ID问题和站点问题的任何其他人。
在数据库中,django有一个django_site表,其中包含(id、domain、name)。这是django存储站点ID的地方。我的在数据库中实际上是5,但我在设置中将其设置为SITE_ID=1
知道了这一点,我现在可以返回到数据库并清除它以返回到零或使用数据库中的实际id。这在站点框架的:
为了在生产中为不同的站点提供服务,您需要创建一个
带有每个站点ID的单独设置文件(可能从
公共设置文件,以避免重复共享设置),然后
为每个站点指定适当的DJANGO_设置_模块
但是如果您不想这样做,您根本无法设置站点ID
,只需使用获取当前站点
在视图中根据域名查找当前站点:
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
如果Django的默认SiteAdmin在显示的列表中包含id字段,那么事情就更容易理解了
为此,您可以重新定义SiteAdmin(应用程序中的任何位置,但我建议您使用admin.py或url.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”字段是您需要用作站点id的字段:
其概念是,每个不同的站点在不同的应用程序服务器实例中运行,该实例使用不同的yourdomain_settings.py启动,然后包括一个base_settings.py和其他常见配置
每个yourdomain_settings.py都将定义自己的SITE_ID和所有其他不同的settings.py参数(静态资源、模板等),然后在启动该域的应用程序服务器实例时,您将看到这些参数
进一步说明:get\u current\u站点(请求)
确实需要request
才能工作。如果您的代码没有站点ID,您可以使用Site.objects.get\u current()
,但是需要在运行的应用程序服务器设置中正确定义站点ID。这说明了:
您需要为要添加的每个域创建单独的设置文件;每个都需要自己的媒体URL和其他设置。您还需要做两件事来确保管理不同站点时一切正常:
在管理员中为每个域创建一个新的Site对象,并将该站点的id作为Site_id放入其设置文件中,以便Django知道数据库中哪个站点对应于此设置文件
在原始站点(id为1的站点)的设置文件中,将其他站点的设置文件添加到ADMIN_进行设置,以让Django知道这一点