由FatBox构建的Django实用工具集合
项目描述
这是FatBox构建的Django项目通用工具集合。
安装
使用pip安装
pip install fatbox-django-utils
如果您要使用模板标记,您还需要将fatbox_utils添加到您的INSTALLED_APPS设置中。
这些工具需要Django 1.3+。它们可能与早期版本兼容,但未经过测试。
渲染模板
render_to装饰器
render_to装饰器允许您非常容易地从视图函数中渲染模板。只需装饰您的视图函数并指定要渲染的模板名称,然后从您的视图函数返回一个包含将在渲染模板时存在于上下文中的变量的字典。
from fatbox_utils.decorators import render_to
@render_to('myapp/template.html')
def myview(request):
return {
'var1': var1,
'var2': var2
}
您可以通过返回一个列表或元组来动态更改模板,其中第一个元素是模板名称,第二个元素是用于上下文的字典。
@render_to('myapp/template.html')
def myview(request):
context = {
'var1': var1,
'var2': var2
}
# if something is true then use our other template
if something_is_true:
return ('other_template.html', context)
# otherwise use the default template
return context
最后,如果您不返回字典或列表/元组,那么render_to将直接返回您提供的值。这确保了如果您返回诸如HttpResponseRedirect对象等东西,它们将按预期工作,但也意味着您可以自由地根据需要创建自己的响应。任何从标准Django视图返回的有效内容都将工作。
Humanize
humanize_time 函数
humanize_time 函数根据您提供的单位总结时间。例如,以下是文档测试中运行的代码:
>>> from fatbox_utils.humanize import humanize_time
>>> humanize_time(173, "hours")
u'1 week, 5 hours'
>>> humanize_time(17313, "seconds")
u'4 hours, 48 minutes, 33 seconds'
>>> humanize_time(5400, "seconds")
u'1 hour, 30 minutes'
>>> humanize_time(90, "weeks")
u'1 year, 10 months, 2 weeks'
>>> humanize_time(42, "months")
u'3 years, 6 months'
>>> humanize_time(500, "days")
u'1 year, 5 months, 3 weeks, 3 days'
缓存
delete_template_fragment_cache 函数
这是一个删除命名模板片段缓存的函数。
见:http://djangosnippets.org/snippets/2723/
在您的模板中
{% load cache %}
{% cache 3600 my_cache_block request.user.username %}
...
{% endcache %}
在您的视图中
from fatbox_utils.cache import delete_template_fragment_cache
def my_view(request):
...
delete_template_fragment_cache("my_cache_block", request.user.username)
...
i18n / 翻译
此包包含一些用于在项目中管理和处理i18n / 翻译的不同实用程序。
current_lang 上下文处理器
这是一个上下文处理器,它将current_lang作为2个字母的语言代码添加到您的模板上下文中(例如en、fr、pt等)。
只需将fatbox_utils.context_processors.current_lang添加到TEMPLATE_CONTEXT_PROCESSORS设置中。
ManualLanguageMiddleware
这是一个中间件类,允许您根据查询字符串参数强制Django翻译层使用的语言。
要使用它,只需将fatbox_utils.middleware.ManualLanguageMiddleware添加到MIDDLEWARE_CLASSES设置中。然后您可以通过名为lang的查询参数传递一个两位数的语言代码来激活特定的语言。
为模型添加translatable_property
当您在处理多个语言的项目的开发中,通常希望某些模型的属性是可翻译的。translatable_property类提供了一个方便的接口来定义应该在多种语言中可用的属性。
考虑以下models.py文件示例
from django.db import models
from fatbox_utils.i18n import translatable_property, TranslatableModel
class Event(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
title = translatable_property('title', 'translations')
details = translatable_property('details', 'translations')
class EventTranslation(TranslatableModel):
event = models.ForeignKey(
Event,
related_name='translations'
)
title = models.CharField(
max_length=32
)
details = models.TextField()
这样做是添加两个模型Event和EventTranslation,其中EventTranslation模型有一个指向Event的外键,并设置了一个名为translations的相关管理器。
EventTranslation模型扩展了TranslatableModel,以便它将设置所需的language字段。该language字段是一个CharField,其选项设置为max_length=2, choices=settings.LANGUAGES。如果您需要对语言选择进行不同的处理,您可以直接从Django的基类models.Model扩展,并定义您自己的language字段。
在Event模型中,我们使用translatable_property类定义了两个属性。当定义这些属性时,第一个参数是相关模型上的字段,第二个参数是我们可以使用它来查找与当前语言对应的关联模型的名称。
当您访问模型上的任何translatable_property属性时,它将尝试从translations管理器中检索相关的对象,其中相关对象有一个名为language的字段,该字段与当前语言匹配,该语言由django.utils.translation包中的get_language函数定义。如果找不到具有匹配language字段的关联对象,它将尝试获取默认语言的对象,该默认语言由settings.DEFAULT_LANGUAGE定义。
性能优化
如果您不对查询集进行任何优化,一旦达到一定数量的Event对象,遍历它们的查询集就会成为对数据库的一个巨大负担,因为当检索所有相关的EventDescription对象时,它需要进行大量的SELECT查找。
为了解决这个问题,您可以使用Django的prefetch_related查询集函数一次性检索所有相关的翻译,从而将查询次数减少到2。
Event.objects.filter(...).prefetch_related('translations')
管理集成
一旦您将模型设置与translatable_property一起使用,您就可以简单地使用正常的Django内联,而无需担心复杂的网站配置。