COTTON_DIR).templates folder can be located in either an app-level or top-level project root folder.Cotton uses the following naming conventions:
COTTON_SNAKE_CASED_NAMES = False see configuration.<c-my-component /><c-sidebar.menu.link />Cotton components can be used with HTML-like syntax or native Django template tags.
Cotton enables you to use html-like syntax to include your components. This tends to enhance productivity as editors and IDEs often provide autocompletion, auto closing and syntax highlighting of xml-like tags out of the box.
<c-button>
Click me
</c-button>
{% cotton button %}
Click me
{% endcotton %}
If you prefer using native template tags you can use Cotton's template tags.
<c-button title="Click me">
Click here
</c-button>
{% cotton button title="Click me" %}
Click here
{% endcotton %}
| Feature | HTML-like Syntax | Native Template Syntax |
|---|---|---|
| Component | <c-button>...</c-button> |
{% cotton button %}...{% endcotton %} |
| Self-closing Component | <c-button /> |
{% cotton button / %} |
| Variables | <c-vars title /> |
{% cotton:vars title %} |
| Named Slot |
|
|
When your component has sub-components, you can define the default component of a folder by adding an index.html. This helps to keep your project structure tidy and reduce additional code in the template.
templates/
├── cotton/
│ ├── card/
│ │ ├── index.html
│ │ ├── header.html
<c-card>
<c-card.header>...</c-card.header>
</c-card>
{% cotton card %}
{% cotton card.header %}...{% endcotton %}
{% endcotton %}
The :attrs dynamic attribute enables us to create wrapper components that proxy all their attributes to an inner component:
<c-outer
class="outer-class"
:count="42"
:enabled="False">
Content passed to inner component
</c-outer>
{% cotton outer class="outer-class" :count="42" :enabled="False" %}
Content passed to inner component
{% endcotton %}
<c-inner :attrs="attrs">{{ slot }}</c-inner>
{% cotton inner :attrs="attrs" %}{{ slot }}{% endcotton %}
{{ class }} <!-- "outer-class" -->
{{ count }} <!-- 42 -->
{{ enabled }} <!-- False -->
{{ slot }} <!-- Content passed to inner component -->
The attributes are passed through to the inner component with their original types preserved (strings, numbers, booleans, lists, etc.), making this pattern ideal for creating higher-order components.
This pattern is particularly useful for Django form fields, where you might create a component hierarchy that passes Django widget attributes through multiple layers while adding labels, error handling, and styling at each level.