2012-05-10 66 views
4

我有興趣設置我的應用程序,以便我可以提供特定於位置的內容。django子域名la craigslist.com

有點像craigslist,其中miami.craigslist.org只顯示邁阿密的帖子。

假設我有一個具有城市字段的模型,那麼實現此目的的最佳方法是什麼?

回答

5

Banjer建議Site框架,但我覺得它可能不是100%完美適合您的情況。網站框架適用於共享相同數據庫的不同站點。但在你的情況下,它的所有相同的網站,你基本上只是想通過一個論點,你的意見,爲城市。

你也許可以做一些甚至只是指出通配符*.domain.com到你的Django站點,然後在視圖中使用request.get_host()解析出的子域名簡單:
https://docs.djangoproject.com/en/1.4/ref/request-response/#django.http.HttpRequest.get_host

因此,如果域名爲:「洛杉磯。 domain.com「,並且你解析出了」losangeles「,你可以在你的查詢中使用它作爲你的城市」標籤「。當你創建新的內容時,你可以在城市標記它。

Post.objects.filter(city_tag="losangeles") 

我想這取決於您的網站需要多大的「位置」結構。它可能是一個帶有各種元數據字段的City模型,其中包括tag字段。然後你會將它與內容作爲外鍵相關聯。這種方法與Sites框架有相同的概念,但在這種情況下,您並不是真正創建不同的網站。

+0

如果我決定採取這種方式,很可能多個視圖取決於城市......有沒有辦法讓網站預先處理子域,並在每個視圖中過濾所有模型? – AlexBrand

+1

@alexBrand:您可能會考慮解析中間件中的子域並將其附加到會話中。這將至少簡化你的urls.py文件。至於自動添加到模型上的過濾器,感覺有點像一個全局變量 - 它們可能很有用,但有時會調試一個婊子(隱藏的演員)。如果你走這條路,把它的鼻涕記錄下來,讓下一個可憐的混蛋在現場工作。 :-) –

+0

您是否願意使用mod_rewrite將city.site.com引導至site.com/city?這是另一個想法 – AlexBrand

1

你應該看看"sites" framework。如果您曾經使用內置的Django管理員,那麼您可能已經看到了網站部分,其中example.com是唯一默認列出的網站。

現實世界的例子,從鏈接我提供:

與關聯多個站點

的Django的網站LJWorld.com和Lawrence.com由 相同新聞機構工作的內容 - 勞倫斯日報 - 世界報在 勞倫斯,堪薩斯州。 LJWorld.com專注於新聞,而Lawrence.com 專注於本地娛樂。但有時候,編輯們希望在兩個網站上發佈文章 。

解決問題的腦死線方式是要求網站 製作者兩次發佈相同的故事:一次爲LJWorld.com,另一次爲Lawrence.com發佈 。但是這對於網站製作者來說效率不高,並且在 數據庫中存儲多個相同故事的副本是多餘的。

更好的解決方案很簡單:這兩個網站使用相同的文章 數據庫,並且文章與一個或多個網站相關聯。

因此而不是市場,你將字段添加到您的模型站點,例如:

sites = models.ManyToManyField(Site) 

你基本上所有的城市都使用一個數據庫。方便,但我想知道它將如何縮小路。我自己開始了一個類似的項目,並將使用Django站點框架來實現該項目。不過,我有興趣聽到數據庫人員提供的更具可擴展性的解決方案。