# Configuration

## Django settings

To use django-bird, you need to configure a few settings in your project:

1. Add django-bird's static file finder to your STATICFILES_FINDERS.
2. Add django-bird's template tags to Django's built-ins. **Note**: This is not required, but if you do not do this you will need to use `{% load django_bird %}` in any templates using components.

```{admonition} Auto Configuration
:class: tip

For automatic configuration of these settings, you can use the [django-bird-autoconf](https://pypi.org/project/django-bird-autoconf/) plugin. This plugin will handle all the setup for you automatically.
```

The complete setup in your settings file should look like this:

```{code-block} python
:caption: settings.py

from pathlib import Path

BASE_DIR = Path(__file__).resolve(strict=True).parent

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [
            BASE_DIR / "templates",
        ],
        "OPTIONS": {
            "builtins": [
                "django_bird.templatetags.django_bird",
            ],
        },
    }
]

STATICFILES_FINDERS = [
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
    "django_bird.staticfiles.BirdAssetFinder",
]
```

This configuration ensures that django-bird's templatetags are available globally and component assets can be properly discovered.
Configuration of django-bird is done through a `DJANGO_BIRD` dictionary in your Django settings.

## Application settings

All app settings are optional. Here is an example configuration with the types and default values shown:

```{code-block} python
:caption: settings.py

from pathlib import Path

DJANGO_BIRD = {
    "COMPONENT_DIRS": list[Path | str] = [],
    "ENABLE_BIRD_ATTRS": bool = True,
    "DEFAULT_ONLY": bool = False,
    "ADD_ASSET_PREFIX": bool | None = None,
}
```

### `COMPONENT_DIRS`

Additional directories to scan for components. Takes a list of paths relative to the base directory of your project's templates directory. A path can either be a `str` or `Path`.

By default, django-bird will look for components in a `bird` directory. Any directories specified here will take precedence and take priority when performing template resolution for components.

#### Example

Suppose you want to store your components in a `components` directory, you're using a third-party library that provides its own bird components, and you have an alternate templates directory.

You can configure django-bird to look in all these locations:

```{code-block} python
:caption: settings.py

from pathlib import Path

BASE_DIR = Path(__file__).resolve(strict=True).parent

DJANGO_BIRD = {
    "COMPONENT_DIRS": [
        "components",
        Path("third_party_library/components"),
        BASE_DIR / "alternate_templates" / "bird",
    ]
}
```

In this configuration:

- `"components"` is a string path relative to your project's templates directory.
- `Path("third_party_library/components")` uses the `Path` object for the third-party library's components.
- `BASE_DIR / "alternate_templates" / "bird"` constructs a path using Django's `BASE_DIR` setting, similar to how other Django settings can be configured.

With this setup, django-bird will search for components in the following order:

1. `components`
2. `third_party_library/components`
3. `alternate_templates/bird`
4. The default `bird` directory

The default `bird` directory will always be checked last, ensuring that your custom directories take precedence in template resolution.


### `ENABLE_BIRD_ATTRS`

Controls whether components automatically receive data attributes related to django-bird in its `attrs` template context variable. Defaults to `True`.

See [Component ID Attribute](params.md#component-id-attribute) for more details on how this works.

### `DEFAULT_ONLY`

Controls whether components are isolated from their parent context by default. Defaults to `False`.

- `False` (default): Components inherit parent context unless you use `only`.
- `True`: Components are isolated by default (as if `only` is always set).

When `DEFAULT_ONLY=True`, you can opt into parent-context access for a single component render by using `inherit`:

```htmldjango
{% bird button inherit %}
    Click me
{% endbird %}
```

### `ADD_ASSET_PREFIX`

Controls whether the app label prefix (`django_bird/`) is added to component asset URLs. This setting has three possible values:

- `None` (default): Automatically add the prefix in production (when `DEBUG = False`) but not in development mode. This matches Django's standard behavior where staticfiles are served directly from source directories in development but collected into a central location in production.

- `True`: Always add the prefix, regardless of the `DEBUG` setting. This is useful if you want consistent URL paths in all environments.

- `False`: Never add the prefix, regardless of the `DEBUG` setting. This is useful for custom static file configurations or when you're manually managing the directory structure.

#### Example Use Cases

- **Testing Environment**: In test environments, especially with Playwright or Selenium e2e tests, you may want to set:

  ```python
  DJANGO_BIRD = {"ADD_ASSET_PREFIX": False}
  ```

  This ensures your tests can find static assets without the prefix, even when `DEBUG = False`.

- **Custom Static File Handling**: If you have a custom static file setup that doesn't follow Django's conventions, you can configure the appropriate value based on your needs.
