django_slots = inclusion tag + blocks
Project description
django_slots
Allows multiline strings to be captured and passed to template tags.
Demo
- Register a component
# app/templatetags/component_tags.py
from django_slots import Library, Component
register = Library()
@register.block_component
class Details(Component):
pass
- Create a template
{# app/templates/components/details.html #}
<details>
<summary>{{ summary|default:slots.summary }}</summary>
{{ slot }}
</details>
Usage:
{% load component_tags %}
{% load slot_tags %}
{% details summary="the summary" %}
the default slot
{% /details %}
{% details %}
{% slot summary %}the <b>summary</b>{% /slot %}
the default slot
{% /details %}
Installation
pip install django-slots
INSTALLED_APPS = [
# ...
'django_slots',
]
Slots
Use {% slot name %}{% /slot %}
to capture and name a slot. These slots will be available in the template in a dictionary called slots
. eg {{ slots.name }}
.
Any lines not surrounded by a slot tag will be available in the component template as {{ slot }}
.
Template
The default the template path is components/<component_name>.html
.
Use template_name
attribute or get_template_name()
method to override.
Change name
By default, the template tag name will be the Component class name converted to snake case. Use the name
attribute to override.
eg:
from django_slots import Component, Library
register = Library()
@register.inline_component
class Button(Component):
name = 'btn'
{% btn %}
Change name format
By default, inline tags are named "{name}/"
and block tags are named "{name}", "/{name}"
. To change this format specify inline_tag_name
and block_tag_names
attributes.
eg:
from django_slots import Component, Library
register = Library()
class AppComponent(Component):
inline_tag_name = "{name}end"
block_tag_names = "{name}", "end{name}"
@register.component
class Button(AppComponent):
pass
{% buttonend %}
{% button %}{% endbutton %}
Inline only template tag
Use @register.inline_component
to only allow {% inline/ %}
use.
Block only template tag
Use @register.block_component
to only allow {% block %}{% /block %}
use.
Validate arguments
Implement def get_content_data(slots, **kwargs)
to validate arguments.
eg:
from django_slots import Component, Library
register = Library()
@register.component
class Button(Component):
STYLE = ["primary", "secondary"]
def get_context_data(self, slots, *, style: str):
if style not in self.STYLE:
raise self.validation_error(f"style {style!r} not in {self.STYLE!r}")
return super().get_context_data(slots, style=style)
Namespace components
Components can be namespaced which is useful for creating a third party app.
from django_slots import Library, Component
register = Library()
class NHSUKComponent(Component):
namespace = 'nhsuk'
@register.component
class Button(NHSUKComponent):
pass
{% nhsuk:button %}
Save and continue
{% /nhsuk:button %}
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
Hashes for django_slots-0.2.7-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 638676a4e3530e949694ed7335d7a15a54b42c8f4bd6e056e2426f6554efdbc3 |
|
MD5 | 99ae6e469d7236282501f4c903a78ca1 |
|
BLAKE2b-256 | fd2e6b48e20791555f9614ce9c6406d006cedc7502bf71f9bd6a8f7180f5f16d |