官术网_书友最值得收藏!

Creating a custom context processor

Sometimes, we might want to calculate or process a value directly in the templates. Jinja2 maintains a notion that the processing of logic should be handled in views and not in templates, and thus, it keeps the templates clean. A context processor becomes a handy tool in this case. We can pass our values to a method; this will then be processed in a Python method, and our resultant value will be returned. Therefore, we are essentially just adding a function to the template context (thanks to Python for allowing us to pass around functions just like any other object).

How to do it…

Let's say we want to show the descriptive name of the product in the format Category / Product-name:

@product_blueprint.context_processor:
def some_processor():
    def full_name(product):
        return '{0} / {1}'.format(product['category'], product['name'])
    return {'full_name': full_name}

A context is simply a dictionary that can be modified to add or remove values. Any method decorated with @product_blueprint.context_processor should return a dictionary that updates the actual context.

We can use the preceding context processor as follows:

{{ full_name(product) }}

We can add this to our app for the product listing (in the flask_app/my_app/templates/product.html file) in the following manner:

{% extends 'home.html' %}

{% block container %}
  <div class="top-pad">
    <h4>{{ full_name(product) }}</h4>
    <h1>{{ product['name'] }}
      <small>{{ product['category'] }}</small>
    </h1>
    <h3>$ {{ product['price'] }}</h3>
  </div>
{% endblock %}

The resulting parsed HTML page will look like the following screenshot:

See also

  • Have a look at the Block composition and layout inheritance recipe to understand the context of this recipe
主站蜘蛛池模板: 大荔县| 五原县| 西畴县| 积石山| 辽宁省| 佳木斯市| 崇左市| 若尔盖县| 眉山市| 广安市| 夏津县| 永新县| 苏州市| 连江县| 庆阳市| 贵阳市| 肥城市| 怀化市| 淮安市| 托克逊县| 凤庆县| 洛阳市| 富平县| 黄大仙区| 竹山县| 赤峰市| 石渠县| 龙泉市| 民乐县| 南安市| 榆中县| 台州市| 嘉义县| 沭阳县| 雅江县| 察隅县| 扎鲁特旗| 桐城市| 嘉兴市| 东至县| 和平县|