跳转到主要内容

由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'

见:http://stackoverflow.com/a/6574789

缓存

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个字母的语言代码添加到您的模板上下文中(例如enfrpt等)。

只需将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()

这样做是添加两个模型EventEventTranslation,其中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内联,而无需担心复杂的网站配置。

模板标签

智能无空格

Django的{% spaceless %}标签是一种优化模板的好方法,以确保向客户端发送尽可能少的数据,然而,在开发过程中,开启无空格功能会让HTML难以阅读,也难以调试问题。

{% smart_spaceless %}标签与正常标签完全相同,只是它仅在您的DEBUG设置为False时应用无空格。

{% load smart_spaceless %}{% smart_spaceless %}
<!doctype html>
<html>
...
</html>
{% end_smart_spaceless %}

URL工具

URL工具模板标签在处理模板中的URL时提供了一些便利函数。它们都需要当前上下文中存在request,因此请确保您已启用django.core.context_processors.request在您的TEMPLATE_CONTEXT_PROCESSORS设置中。

build_absolute_uri

这将在您的模板中公开请求对象的build_absolute_uri函数。

{% load urltools %}

<a href="{% build_absolute_uri myobject.get_absolute_url %}">Link</a>

modify_querystring

这允许您修改单个查询字符串参数,而无需重建整个URL。

例如,假设您在一个显示对象列表的页面上,您有标志来确定用户是否将结果视为网格或列表。在此视图中,您可能接受查询字符串参数以进一步限制查询。因此,仅为了更改格式而手动重建URL将变成一个更复杂的任务。使用modify_querystring,我们可以只更改format查询字符串参数(即使它不存在也添加它),而无需重建任何内容。

{% load urltools %}

<div>
  <span>Sort:</span>
  <a href="{% modify_querystring sort="date" %}"{% if sort_by == "date" %} class="active"{% endif %}>By Date</a> |
  <a href="{% modify_querystring sort="title" %}"{% if sort_by == "title" %} class="active"{% endif %}>Alphabetically</a>
</div>

<div>
    <span>View as:</span>
    <a href="{% modify_querystring format="list" %}" {% if page_format == "list"%}class="active"{% endif %}>List</a> |
    <a href="{% modify_querystring format="grid" %}" {% if page_format == "grid"%}class="active"{% endif %}>Grid</a>
</div>

项目详情


下载文件

下载适合您平台的自定义文件。如果您不确定选择哪个,请了解有关安装软件包的更多信息。

源分发

支持者