Skip to main content

dj-angles </>

PyPI PyPI - Downloads GitHub Sponsors All Contributors

⭐ Features

  • Use HTML-like elements in Django templates, e.g. <dj-some-partial /> instead of {% include 'some-partial.html' %}
  • Can be sprinkled in as needed to enhance existing Django functionality
  • Since it looks like HTML, syntax highlighting mostly "just works"
  • Wraps components in a custom HTML element for easier debugging and targeted CSS styling
  • Support for the Shadow DOM to encapsulate component styles
  • Error boundaries to catch and display template errors
  • Lightweight way to submit forms via AJAX and swap in the resulting HTML

Third-party package integrations

Template tags

  • call: call functions in a template
  • model: call a model in a template
  • template: lightweight inline template
  • view: render a view in a template

Filters

💥 Examples

<!-- base.html -->
<dj-block name="content">  <!-- {% block content %} -->
</dj-block>  <!-- {% endblock content %} -->
<!-- template-tags.html -->
<dj-extends parent="base.html" />  <!-- {% extends "base.html" %} -->

<dj-block name="content">  <!-- {% block content %} -->
  <!-- components -->
  <dj-some-partial />  <!-- {% include "test-partial.html" %} -->
  <dj-include template="test-partial.html" />  <!-- {% include "test-partial.html" %} -->

  <dj-verbatim>  <!-- {% verbatim %} -->
    This is verbatim: {% include %}
  </dj-verbatim>  <!-- {% endverbatim %} -->

  <dj-comment>  <!-- {% comment %} -->
    this is a comment
  </dj-comment>  <!-- {% endcomment %} -->

  <dj-autoescape-on>  <!-- {% autoescape-on %} -->
    This is escaped
  </dj-autoescape-on>  <!-- {% endautoescape %} -->

  <dj-autoescape-off>  <!-- {% autoescape off %} -->
    This is not escaped
  </dj-autoescape-off>  <!-- {% endautoescape %} -->

  <dj-csrf />  <!-- {% csrf_token %} -->

  <dj-debug />  <!-- {% debug %} -->
</dj-block>  <!-- {% endblock content %} -->
<!-- static-helpers.html -->
<dj-image src="img/django.jpg" />  <!-- <img src="{% static 'img/django.jpg' %}" /> -->
<dj-css href="css/styles.css" />  <!-- <link href="{% static 'css/styles.css' %}" rel="stylesheet" /> -->
<!-- call-code-from-template.html -->
<dj-call code="slugify('Hello Goodbye')" as="variable_name" />  <!-- {% call slugify("Hello Goodbye") as variable_name %} -->
<dj-model code="Book.objects.filter(id=1)" as="book" />  <!-- {% model Book.objects.filter(id=1) as book %} -->
<dj-view name="some-view" />  <!-- {% view "some-view" %} -->
<!-- django-compressor.html -->
<dj-compress css> <!-- {% compress css %} -->
  <style>.critical { color: red; }</style>
</dj-compress> <!-- {% endcompress %} -->
<!-- third-party-component-libraries.html -->

<!-- django-components -->
<dj-component name="button">Click me</dj-component>  <!-- {% component "button" %}Click me{% endcomponent %} -->

<!-- django-viewcomponent -->
<dj-viewcomponent name="button">Click me</dj-viewcomponent>  <!-- {% viewcomponent "button" %}Click me{% endviewcomponent %} -->

<!-- django-bird -->
<dj-bird template="button" class="btn">Click me</dj-bird>  <!-- {% bird "button" class="btn" %}Click me{% endbird %} -->

<!-- django-template-partials -->
<dj-partial name="sidebar">  <!-- {% partialdef sidebar %} -->
  <p>Sidebar content</p>
</dj-partial>  <!-- {% endpartialdef %} -->

<dj-partial name="sidebar" />  <!-- {% partial sidebar %} -->
<!-- inline-expressions.html -->
{{ request.user.username or request.user.email }}  <!-- {% if request.user.username %}{{ request.user.username }}{% else %}{{ request.user.email }}{% endif %} -->
{{ request.user.username if request.user.is_authenticated else "Unknown" }}  <!-- {% if request.user.is_authenticated %}{{ request.user.username }}{% else %}Unknown{% endif %} -->
<!-- error-boundaries.html -->
<dj-block name="content" error-boundary>
  <dj-include template="missing-template.html" />
</dj-block>

<dj-error-boundary>
  <dj-include template="missing-template.html" />
</dj-error-boundary>
<!-- ajax-form-submission.html -->
<dj-form action="/submit" method="POST" swap="outerHTML" ajax csrf> <!-- <ajax-form><form action="/submit" method="POST">{% csrf_token %} -->
  <button type="submit">Submit</button>
</dj-form><!-- </form></ajax-form> -->
<!-- conditional-attributes.html -->
<div dj-if="True">  <!-- {% if True %}<div> -->
  If
</div>
<div dj-elif="False">  <!-- {% elif False %}<div> -->
  Elif
</div>
<div dj-else>  <!-- {% else %}<div> -->
  Else
</div>  <!-- </div>{% endif %} -->
<!-- value-attribute.html -->
<div dj-value="request.user">  <!-- <div>{{ request.user }}</div> -->
</div>

📖 Documentation

To learn how to install and use dj-angles see the complete documentation at https://dj-angles.adamghill.com/.

✨ Inspiration

🙌 Contributors

Emmanuelle Delescolle
Emmanuelle Delescolle

💻 ⚠️ 📖
Jarkko Saltiola
Jarkko Saltiola

📖

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dj_angles-0.27.0.tar.gz (37.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dj_angles-0.27.0-py3-none-any.whl (51.7 kB view details)

Uploaded Python 3

File details

Details for the file dj_angles-0.27.0.tar.gz.

File metadata

  • Download URL: dj_angles-0.27.0.tar.gz
  • Upload date:
  • Size: 37.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dj_angles-0.27.0.tar.gz
Algorithm Hash digest
SHA256 56c394232f96568314ed0f37241edbc03448550123ca16f2e5c7b0bbbcceb735
MD5 709b4a2e88c952789bfa026c71fa8c59
BLAKE2b-256 644abda29b7e7573fdbbea638ce597a96f9ce7ee64f7e2f87f7c2c2f6668cc11

See more details on using hashes here.

Provenance

The following attestation bundles were made for dj_angles-0.27.0.tar.gz:

Publisher: publish.yml on adamghill/dj-angles

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dj_angles-0.27.0-py3-none-any.whl.

File metadata

  • Download URL: dj_angles-0.27.0-py3-none-any.whl
  • Upload date:
  • Size: 51.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dj_angles-0.27.0-py3-none-any.whl
Algorithm Hash digest
SHA256 59762f1dab6b16a97ca6dc515669db7d0a7fe4414b06afea337f6603f90aecd7
MD5 862512e0244f3075476055d715808367
BLAKE2b-256 4b24a6b454661a4440bd516596c89f8701fcc00732363c31cb5566658e442906

See more details on using hashes here.

Provenance

The following attestation bundles were made for dj_angles-0.27.0-py3-none-any.whl:

Publisher: publish.yml on adamghill/dj-angles

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.27.0 This release

2 files

0.26.0

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.1

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.1

2 files

0.10.0

2 files

0.9.0

2 files

0.8.1

2 files

0.8.0

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page