当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 集成的子框架

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:27

讲述的是用多站点框架能够完成的几项工作。多个站点的数据重用正如在情景一中所解释的,要在多个站点间重用数据,仅需在模型中为 Site 添加一个 多对多字段 即可,例如:from django.db import modelsfrom django.contrib.sites.models import Siteclass Article(models.Model): headline = models.CharField(max_length=200) # ... sites = models.ManyToManyField(Site)这是在数据库中为多个站点进行文章关联操作的基础步骤。 在适当的位置使用该技术,你可以在多个站点中重复使用同一段 Django 视图代码。 继续 Article 模型范例,下面是一个可能的 article_detail 视图:from django.conf import settingsfrom django.shortcuts import get_object_or_404from mysite.articles.models import Articledef article_detail(request, article_id): a = get_object_or_404(Article, id=article_id, sites__id=settings.SITE_ID) # ...该视图方法是可重用的,因为它根据 SITE_ID 设置的值动态检查 articles 站点。例如, LJWorld.coms 设置文件中有有个 SITE_ID 设置为 1 ,而 Lawrence.coms 设置文件中有个 SITE_ID 设置为 2 。如果该视图在 LJWorld.coms 处于激活状态时被调用,那么它将把查找范围局限于站点列表包括 LJWorld.com 在内的文章。将内容与单一站点相关联同样,你也可以使用 外键 在多对一关系中将一个模型关联到 Site 模型。举例来说,如果某篇文章仅仅能够出现在一个站点上,你可以使用下面这样的模型:from django.db import modelsfrom django.contrib.sites.models import Siteclass Article(models.Model): headline = models.CharField(max_length=200) # ... site = models.ForeignKey(Site)这与前一节中介绍的一样有益。从视图钩挂当前站点在底层,通过在 Django 视图中使用多站点框架,你可以让视图根据调用站点不同而完成不同的工作,例如:from django.conf import settingsdef my_view(request): if settings.SITE_ID == 3: # Do something. else: # Do something else.当然,像那样对站点 ID 进行硬编码是比较难看的。 略为简洁的完成方式是查看当前的站点域:from django.conf import settingsfrom django.contrib.sites.models import Sitedef my_view(request): current_site = Site.objects.get(id=settings.SITE_ID) if current_site.domain == 'foo.com': # Do something else: # Do something else.从 Site 对象中获取 settings.SITE_ID 值的做法比较常见,因此 Site 模型管理器 (Site.objects ) 具备一个get_current() 方法。 下面的例子与前一个是等效的:from django.contrib.sites.models import Sitedef my_view(request): current_site = Site.objects.get_current() if current_site.domain == 'foo.com': # Do something else: # Do something else.注意在这个最后的例子里,你不用导入 django.conf.settings 。获取当前域用于呈现正如情景二中所解释的那样,依据DRY原则(不做重复工作),你只需在一个位置储存站名和域名,然后引用当前Site 对象的 name 和 domain 。例如: 例如:from django.contrib.sites.models import Sitefrom django.core.mail import send_maildef register_for_newsletter(request): # Check form values, etc., and subscribe the user. # ... current_site = Site.objects.get_current() send_mail('Thanks for subscribing to %s alerts' % current_site.name, 'Thanks for your subscription. We appreciate it.\n\n-The %s team.' % current_site.name, 'editor@%s' % current_site.domain, [user_email]) # ...继续我们正在讨论的 LJWorld.com 和 Lawrence.com 例子,在Lawrence.com 该邮件的标题行是“感谢注册 Lawrence.com 提醒信件”。 在 LJWorld.com ,该邮件标题行是“感谢注册 LJWorld.com 提醒信件”。 这种站点关联行为方式对邮件信息主体也同样适用。完成这项工作的一种更加灵活(但更重量级)的方法是使用 Django 的模板系统。 假定 Lawrence.com 和 LJWorld.com 各自拥有不同的模板目录( TEMPLATE_DIRS ),你可将工作轻松地转交给模板系统,如下所示:from django.core.mail import send_mailfrom django.template import loader, Contextdef register_for_newsletter(request): # Check form values, etc., and subscribe the user. # ... subject = loader.get_template('alerts/subject.txt').render(Context({})) message = loader.get_template('alerts/message.txt').render(Context({})) send_mail(subject, message, 'do-not-reply@example.com', [user_email]) # ...本例中,你不得不在 LJWorld.com 和 Lawrence.com 的模板目录中都创建一份 subject.txt 和 message.txt模板。 正如之前所说,该方法带来了更大的灵活性,但也带来了更多复杂性。尽可能多的利用 Site 对象是减少不必要的复杂、冗余工作的好办法。当前站点管理器如果 站点 在你的应用中扮演很重要的角色,请考虑在你的模型中使用方便的 CurrentSiteManager 。 这是一个模型管理器(见第十章),它会自动过滤使其只包含与当前站点相关联的对象。通过显示地将 CurrentSiteManager 加入模型中以使用它。 例如:from django.db import modelsfrom django.contrib.sites.models import Sitefrom django.contrib.sites.managers import CurrentSiteManagerclass Photo(models.Model): photo = models.FileField(upload_to='/home/photos') photographer_name = models.CharField(max_length=100) pub_date = models.DateField() site = models.ForeignKey(Site) objects = models.Manager() on_site = CurrentSiteManager()通过该模型, Photo.objects.all() 将返回数据库中所有的 Photo 对象,而 Photo.on_site.all() 仅根据SITE_ID 设置返回与当前站点相关联的 Photo 对象。换言之,以下两条语句是等效的:Photo.objects.filter(site=settings.SITE_ID)Photo.on_site.all()CurrentSiteManager 是如何知道 Photo 的哪个字段是 Site

上一页  [1] [2] [3] [4] [5] [6]  下一页


Django 集成的子框架