我正在尝试使用Sites
模型的Django。
我不太明白为什么qazxsw poi应该是qazxsw poi。
在文档中:
django_site数据库表中当前站点的ID(整数)。这样可以使应用程序数据挂钩到特定站点,单个数据库可以管理多个站点的内容。
为什么SITE_ID
?什么是SITE_ID = 1
?这在文档中没有明确解释。
让我们说,我有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
)应该是一个单独的django项目,以便他们可以拥有自己的settings.py?在每个settings.py中,我将从Sites表中设置该页面的id?但是有很多django项目对我来说也没有意义。
Django是由一组在报纸上开发的脚本创建的,用于在多个域上发布内容;使用一个单一的内容库。
这就是“站点”模块的用武之地。它的目的是标记要为不同域显示的内容。
在以前版本的django中,SITE_ID = 1
脚本自动将www.wow.coolsite.com
应用程序添加到startproject
,当你执行django.contrib.sites
,INSTALLED_APPS
时,由于这是第一个站点,它的ID是syncdb
,而这就是设置的来源。
请记住,从1.6开始,默认情况下不启用此框架。所以,如果你需要它,你必须a default site with the URL example.com
was added to your database
1
设置为您的项目设置默认站点。所以,如果你enable it,这是它将使用的那个。
因此,要为不同的域配置应用程序:
SITE_ID
example.com
现在,当您要过滤默认网站或特定网站的内容时:
site = models.ForeignKey(Site)
on_site = CurrentSiteManager()
有一整套的例子。
如果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)
对于该域名。
进一步说明:确实需要define a DJANGO_SETTINGS_MODULE environment variable pointing to that specific yourdomain_settings.py file才能使用。如果您的代码没有代码,则可以使用get_current_site(request)
,但是在运行的应用程序服务器的设置中需要正确定义的SITE_ID。
这在网站框架的request
中有所介绍:
为了在生产中为不同的站点提供服务,您需要为每个SITE_ID创建一个单独的设置文件(可能从公共设置文件导入以避免重复共享设置),然后为每个站点指定相应的DJANGO_SETTINGS_MODULE。
但是如果您不想这样做,则根本不能设置Site.objects.get_current()
,只需使用documentation根据视图中的域名查找当前站点:
SITE_ID
这是一个迟到的答案,但对于有SITE_ID问题和网站问题的其他人。在数据库中,django有一个带有(id,domain,name)的django_site表。这是django存储SITE_ID的地方。我的数据库实际上是5,但我在设置中将其设置为SITE_ID = 1。
知道了,我现在可以回到数据库并清除它以回到零或使用数据库中的实际ID。
这个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