Skip to main content

为 Django 提供一种基于请求上下文切换模板的机制。

项目描述

我们经常希望为手机、平板电脑和桌面浏览器呈现不同的 HTML 模板。或用于 AB 测试。django-variatmpl 让它变得简单。通过设置request.variant,您可以根据该request.variant呈现模板。这个库深受Action Pack Variants的启发。

特拉维斯 工作服.io 最新版本 执照

快速开始

  1. 安装django-variantmpl

$ pip install django-variantmpl
  1. 在您的视图中将django.shortcuts.render更改为variantmpl.shortcuts.render

  • 并设置request.variant属性。

# views.py --

# from django.shortcuts import render
from variantmpl.shortcuts import render # <- add

def sample(request):

    # Set variant value
    request.variant = 'v2'

    return render(request, 'index.html')
  1. 准备变体模板。

$ echo 'sample v1' > templates/index.html
$ echo 'sample v2' > templates/index+v2.html
  1. 确认views.sample在您的浏览器中显示。

  • 您可以查看示例 v2

  • 它是基于request.variant加载模板( index+v2.html )的结果。

特征

使成为

使用而不是django.shortcuts.render

# views.py --

from variantmpl.shortcuts import render

def sample(request):
    request.variant = 'v2'

    # Actually "index+v2.html" is rendered
    return render(request, 'index.html')

render_to_response

使用而不是django.shortcuts.render_to_response

# views.py --

from variantmpl.shortcuts import render_to_response

def sample(request):

    # Actually "index+v2.html" is rendered
    return render_to_response(request, 'index.html', variant='v2')

您可以将变体设置为关键字参数。

渲染到字符串

使用而不是django.template.loader.render_to_string

# views.py --

from django.http import HttpResponse

from variantmpl.template.loader import render_to_string

def sample(request):
    request.variant = 'v2'

    # Actually "index+v2.html" is rendered
    content = render_to_string('index.html', request=request)
    return HttpResponse(content)

模板响应

使用而不是django.template.response.TemplateResponse

# views.py --

from django.views.generic import TemplateView
from variantmpl.template.response import TemplateResponse

class SampleView(TemplateView):
    template_name = 'sample/index.html'
    response_class = TemplateResponse # Replace response class

    def get(self, request, **kwargs):
        request.variant = 'v2'

        # Actually "index+v2.html" is rendered
        return super().get(request, **kwargs)

sample = SampleView.as_view()

猴子修补 Django 的函数/类

很难将所有已经包含大代码的代码重写为variantmpl代码。在这种情况下,您可以将 Monkey 补丁应用于 Django 的函数/类。

注意:此功能是实验性的。如果将来发生意外的不良影响,可能会删除它。

# settings.py --

SECRET_KEY = 'xxxxxx'

# You must write this code below SECRET_KEY.
from variantmpl import monkey
monkey.patch_all()
# views.py --

# You don't need to replace to 'variantmpl'.
from django.shortcuts import render

def sample(request):
    request.variant = 'v2'

    # Actually "index+v2.html" is rendered
    return render(request, 'index.html')

猴子修补的所有目标。

django.shortcuts.render
django.shortcuts.render_to_response
django.template.loader.render_to_string
django.template.response.TemplateResponse.resolve_template

They are replaced by the functions/methods of the same name in `variantmpl`.

配置

VARIANTMPL_VARIANT_FORMAT

您可以更改变格式。默认值:+变体

# settings.py --
VARIANTMPL_VARIANT_FORMAT = '@{variant}'
# The lookup target template name changes as follows.

"index+variant.html" -> "index@variant.html"

VARIANTMPL_PROPERTY_NAME

您可以重命名request.variant属性。

# settings.py --
VARIANTMPL_PROPERTY_NAME = 'mutation'
# You can set 'mutation' instead of 'varaiant'
request.mutation = 'v2'

VARIANTMPL_TEMPLATE_FORMAT

您可以更改插入模板路径的变体的位置。

# For example, you have this path.
render('sample1/sample2/index.html')

# variantmpl inserts the variant(v2) as follows.
'sample1/sample2/index+v2.html'

# At this time, VARIANTMPL_TEMPLATE_FORMAT is like this. (default)
VARIANTMPL_TEMPLATE_FORMAT = '{dirpath}{filename}{variant}.{ext}'
dirpath  # => 'sample1/sample2/'
filename # => 'index'
variant  # => '+v2'
ext      # => 'html'

像这样改变这种格式。

VARIANTMPL_TEMPLATE_FORMAT = '{variant}/{dirpath}{filename}.{ext}'

# variantmpl inserts the variant(v2) as follows.
'+v2/sample1/sample2/index.html'

在这种情况下,模板布局将更改如下

templates
  ├── +v2
  │   └── sample1
  │       └── sample2
  │           └── index.html
  └── sample1
      └── sample2
          └── index.html

Python 和 Django 支持

  • Python 3.4 以后

  • Django 1.10 以后

  • 仅支持最新的 3 个版本。

执照

麻省理工学院执照。有关特定条款,请参阅 LICENSE 文件。

历史

0.1.0(2017 年 12 月 26 日)

  • 首次发布

项目详情


下载文件

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

源分布

django-variantmpl-0.1.0.tar.gz (9.0 kB 查看哈希)

已上传 source

内置分布

django_variantmpl-0.1.0-py3-none-any.whl (9.5 kB 查看哈希)

已上传 py3