我正在使用 Django 开发一个网站,我们在其中列出产品和一些评论。我想为具有不同产品对象的每个国家/地区建立单独的站点。例如:
us.domain.com - 列出了美国的产品,页面为英文。
fr.domain.com - 列出了法国的产品,页面为法语等。
1)我想到的是根据中间件中请求的子域更改 settings.SITE_ID ,但这据说很危险。我还可以做些什么?我不想为每个国家/地区运行单独的实例或 settings.py 文件。
到目前为止我的解决方案:
class SubdomainMiddleware:
def process_request(self, request):
host = request.META.get('HTTP_HOST', '')
try:
site = Site.objects.get(domain=host)
except:
site = Site.objects.get(domain='www.domain.com')
request.site = site
products = Product.objects.filter(site_id=request.site)
在这里,下面不起作用,因为 CurrentSiteManager 使用 settings.SITE_ID,而不是 request.site:
on_site = CurrentSiteManager()
Product.on_site.all()
我必须在每个查询中明确传递 site_id=request.site 。这是安全的,还是有其他选择?
2)如果我将 site = models.ForeignKey(Site) 字段添加到 Product 模型中,就足够了吗?或者我应该将该字段添加到所有其他模型,如评论等?