簡體   English   中英

Django'Sites'模型-什么是SITE_ID = 1',為什么?

[英]Django 'Sites' Model - what is and why is 'SITE_ID = 1'?

我正在嘗試使用Django的Sites模型。

我不太明白為什么SITE_ID應該是SITE_ID = 1

在文檔中:

django_site數據庫表中當前站點的ID(整數)。 使用它是為了使應用程序數據可以掛接到特定站點,並且單個數據庫可以管理多個站點的內容。

為什么1 current site什么? 這在文檔中沒有明確解釋。

可以說,我有www.somecoolsite.com和其他一些子域,例如www.wow.coolsite.comwww.awesome.coolsite.com

我想根據域名呈現不同的內容。

我的問題是,或者更好的是:

  1. 我是否必須將所有這些域添加到數據庫的Sites Table中?
  2. 如果是這樣,如何在設置中設置SITE_ID 我是否必須設置所有ID,例如SITE_ID = 1SITE_ID = 2 ..等?
  3. current siteSITE_ID = 1什么關系?

我在這里有點困惑。

我認為,每個站點(例如www.wow.coolsite.com )都應該是一個單獨的django項目,以便它們可以擁有自己的settings.py? 並在每個settings.py中,從Sites表中設置該頁面的ID? 但是然后有很多Django項目對我來說也沒有意義。

Django是由報紙上開發的一組腳本創建的,用於在多個域上發布內容。 使用一個單一的內容庫。

這是“站點”模塊的所在。其目的是標記要顯示在不同域中的內容。

在以前的django版本中, startproject腳本會自動將django.contrib.sites應用程序添加到INSTALLED_APPS ,並且當您執行syncdb時, startproject 具有URL example.com的默認站點添加到數據庫中 ,並且由於這是第一個站點,其ID為1 ,這就是設置的來源。

請記住,從1.6開始,默認情況下未啟用此框架。 因此,如果需要,則必須啟用它

SITE_ID設置為您的項目設置默認站點。 因此,如果您未指定site ,則將使用該站點

因此,為不同的域配置您的應用程序:

  1. 啟用網站框架
  2. 將默認站點從example.com更改為您的默認域。 您可以從django shell或管理員執行此操作。
  3. 將您要發布其內容的其他網站添加到站點應用程序。 同樣,您可以像其他任何應用程序一樣從django shell或從管理員執行此操作。
  4. 在您的對象site = models.ForeignKey(Site)向站點模型添加外鍵
  5. 添加站點管理器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

文檔具有完整的示例集。

如果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的字段:

修改后的管理頁面,顯示站點記錄的ID

其概念是,每個不同的站點都在不同的應用程序服務器實例中運行,並使用不同的yourdomain_settings.py啟動,然后,該yourdomain_settings.py包括base_settings.py和其余的通用配置。

這些yourdomain_settings.py中的每一個都將定義自己的SITE_ID以及它們需要看起來彼此不同的所有其他settings.py參數(靜態資源,模板等),然后定義一個DJANGO_SETTINGS_MODULE環境變量,指向啟動該域的應用程序服務器實例時,該特定的yourdomain_settings.py文件

進一步說明: get_current_site(request)確實需要request才能使它起作用。 如果您的代碼中沒有,則可以使用Site.objects.get_current() ,但需要在運行的應用程序服務器的設置中正確定義的SITE_ID。

網站框架的文檔中對此進行了介紹

為了在生產中為不同的站點提供服務,您將為每個SITE_ID創建一個單獨的設置文件(可能從一個公共設置文件導入以避免重復的共享設置),然后為每個站點指定適當的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

這是一個較晚的答案,但適用於其他任何有SITE_ID問題和網站問題的人。 在數據庫內部,django有一個帶有(id,domain,name)的django_site表。 django在這里存儲SITE_ID。 我的實際上是數據庫中的5,但我在設置中將其設置為SITE_ID = 1。

知道了這一點,我現在可以返回數據庫並清除它以使其恢復為零或使用數據庫中的實際ID。

鏈接對此進行了解釋:

您將要為要添加的每個域創建單獨的設置文件; 每個人都需要自己的MEDIA_URL和其他設置。 您還需要做兩件事,以確保一切正常,以管理不同的站點:

在管理員中為每個域創建一個新的Site對象,並將該Site的ID作為SITE_ID放入其設置文件中,以便Django知道數據庫中的哪個站點與此設置文件相對應。

在原始站點的設置文件(ID為1的站點)中,將其他站點的設置文件添加到ADMIN_FOR設置中,以使Django知道管理應用程序的這一實例將處理所有站點。

另外,如果您想了解如何修改模型和設置視圖,則可以查看以下鏈接: https : //django.cowhite.com/blog/managing-multiple-websites-with-a-common-database-在django-sites-framework /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM