Micro-library to easily write custom Django template tags
Project description
django-tag-parser
A micro-library to easily write custom Django template tags.
Features:
Functions to parse tags, especially: “args”, “kwargs”, and “as varname” syntax.
Real OOP classes to write custom inclusion tags.
Functions:
parse_token_kwargs: split a token into the tag name, args and kwargs.
parse_as_var: extract the “as varname” from a token.
Base classes (in tag_parser.basetags):
BaseNode: A template Node object which features some basic parsing abilities.
BaseInclusionNode: a Node that has inclusion_tag like behaviour, but allows to override the template_name dynamically.
BaseAssignmentNode: a Node that returns the value in the context, using the as var syntax.
BaseAssignmentOrOutputNode: a Node that either displays the value, or inserts it in the context.
BaseAssignmentOrInclusionNode: a class that allows a {% get_items template="..." %} and {% get_items as var %} syntax.
The base classes allows to implement @register.simple_tag, @register.inclusion_tag and @register.assignment_tag like functionalities, while still leaving room to extend the parsing, rendering or syntax validation. For example, not all arguments need to be seen as template variables, filters or literal keywords.
As of v3.0, the @template_tag decorator is no longer needed. Use @register.tag("name") directly on the class names.
Installation
First install the module, preferably in a virtual environment. It can be installed from PyPI:
pip install django-tag-parser
Examples
At the top of your template tags library, always include the standard Django register variable and our template_tag decorator:
from django.template import Library
from tag_parser import template_tag
register = Library()
Arguments and keyword arguments
To parse a syntax like:
{% my_tag "arg1" keyword1="bar" keyword2="foo" %}
use:
from django.template import Library
from tag_parser.basetags import BaseNode
register = Library()
@register.tag('my_tag')
class MyTagNode(BaseNode):
max_args = 1
allowed_kwargs = ('keyword1', 'keyword2',)
def render_tag(self, context, *tag_args, **tag_kwargs):
return "Tag Output"
Custom parsing
With the standard Node class from Django, it’s easier to implement custom syntax. For example, to parse:
{% getfirstof val1 val2 as val3 %}
use:
from django.template import Library, Node, TemplateSyntaxError
from tag_parser import parse_token_kwargs, parse_as_var
register = Library()
@register.tag('getfirstof')
class GetFirstOfNode(Node):
def __init__(self, options, as_var):
self.options = options # list of FilterExpression nodes.
self.as_var = as_var
@classmethod
def parse(cls, parser, token):
bits, as_var = parse_as_var(parser, token)
tag_name, options, _ = parse_token_kwargs(parser, bits, allowed_kwargs=())
if as_var is None or not choices:
raise TemplateSyntaxError("Expected syntax: {{% {0} val1 val2 as val %}}".format(tag_name))
return cls(options, as_var)
def render(self, context):
value = None
for filterexpr in self.options:
# The ignore_failures argument prevents that the value becomes TEMPLATE_STRING_IF_INVALID.
value = filterexpr.resolve(context, ignore_failures=True)
if value is not None:
break
context[self.as_var] = value
return ''
Contributing
This module is designed to be generic. In case there is anything you didn’t like about it, or think it’s not flexible enough, please let us know. We’d love to improve it!
If you have any other valuable contribution, suggestion or idea, please let us know as well because we will look into it. Pull requests are welcome too. :-)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-tag-parser-3.0.tar.gz
.
File metadata
- Download URL: django-tag-parser-3.0.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bf34223cd2db4397ceef570446399fd33e88ff645dceef14ff20aebcc4fb9b4c |
|
MD5 | eb21b6732ef0d89b9c5676c501688d0c |
|
BLAKE2b-256 | b3b9e06dcd58f306060ef4033d04fc461706ad3dab243ac526540bd6f973eae4 |
File details
Details for the file django_tag_parser-3.0-py2.py3-none-any.whl
.
File metadata
- Download URL: django_tag_parser-3.0-py2.py3-none-any.whl
- Upload date:
- Size: 16.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | edc01432e2f8222038f68fbf5e59d1b9e659e83b709a81e98036900eac01def5 |
|
MD5 | f1ca8460351c964f7ed85f7421856807 |
|
BLAKE2b-256 | c802d0eab3e7f0417555144542bf1086f8dcc5e01277fb93cee44f185a981708 |