(overview)=
# Documents overview
This page provides an overview of the basics of using the `'wagtail.documents'` app in your Wagtail project.
## Including `'wagtail.documents'` in `INSTALLED_APPS`
To use the `wagtail.documents` app, you need to include it in the `INSTALLED_APPS` list in your Django project's settings. Simply add it to the list like this:
```python
# settings.py
INSTALLED_APPS = [
# ...
'wagtail.documents',
# ...
]
```
## Setting up URLs
Next, you need to set up URLs for the `wagtail.documents` app. You can include these URLs in your project's main urls.py file. To do this, add the following lines:
```python
# urls.py
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
# ...
path('documents/', include(wagtaildocs_urls)),
# ...
]
```
New documents saved are stored in the [reference index](managing_the_reference_index) by default.
## Using documents in a Page
To include a document file in a Wagtail page, you can use `FieldPanel` in your page model.
Here's an example:
```python
# models.py
from wagtail.admin.panels import FieldPanel
from wagtail.documents import get_document_model
class YourPage(Page):
# ...
document = models.ForeignKey(
get_document_model(),
null=True,
blank=True,
on_delete=models.SET_NULL,
)
content_panels = Page.content_panels + [
# ...
FieldPanel('document'),
]
```
This allows you to select a document file when creating or editing a page, and link to it in your page template.
Here's an example template to access the document field and render it:
```html
{% extends "base.html" %}
{% block content %}
{% if page.document %}
Document: {{ page.document.title }}
File Type: {{ page.document.file_extension }}
View Document
{% else %}
No document attached to this page.
{% endif %}
{{ page.body }}
{% endblock %}
```
## Using documents within `RichTextFields`
Links to documents can be made in pages using the [`RichTextField`](rich_text_docs). By default, Wagtail will include the features for adding links to documents see [](rich_text_features).
You can either exclude or include these by passing the `features` to your `RichTextField`. In the example below we create a `RichTextField` with only documents and basic formatting.
```python
# models.py
from wagtail.fields import RichTextField
class BlogPage(Page):
# ...other fields
document_footnotes = RichTextField(
blank=True,
features=["bold", "italic", "ol", "document-link"]
)
panels = [
# ...other panels
FieldPanel("document_footnotes"),
]
```
## Using documents within `StreamField`
`StreamField` provides a content editing model suitable for pages that do not follow a fixed structure. To add links to documents using `StreamField`, include it in your models and also include the `DocumentChooserBlock`.
Create a `Page` model with a `StreamField` named `doc` and a `DocumentChooserBlock` named `doc_link` inside the field:
```python
# models.py
from wagtail.fields import StreamField
from wagtail.documents.blocks import DocumentChooserBlock
class BlogPage(Page):
# ... other fields
documents = StreamField([
('document', DocumentChooserBlock())
],
null=True,
blank=True,
use_json_field=True,
)
panels = [
# ... other panels
FieldPanel("documents"),
]
```
In `blog_page.html`, add the following block of code to display the document link in the page:
```html
{% for block in page.documents %}
{{ block.value.title }}
{% endfor %}
```
## Working documents and collections
Documents in Wagtail can be organized within [collections](https://docs.wagtail.org/en/v4.0/editor_manual/documents_images_snippets/collections.html). Collections provide a way to group related documents. You can cross-link documents between collections and make them accessible through different parts of your site.
Here's an example:
```python
from wagtail.documents import get_document_model
class PageWithCollection(Page):
collection = models.ForeignKey(
"wagtailcore.Collection",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+',
verbose_name='Document Collection',
)
content_panels = Page.content_panels + [
FieldPanel("collection"),
]
def get_context(self, request):
context = super().get_context(request)
documents = get_document_model().objects.filter(collection=self.collection)
context['documents'] = documents
return context
```
Here’s an example template to access the document collection and render it:
```html
{% extends "base.html" %}
{% load wagtailcore_tags %}
{% block content %}
{% if documents %}
Documents:
{% endif %}
{% endblock %}
```
## Making documents private
If you want to restrict access to certain documents, you can place them in [private collections](https://guide.wagtail.org/en-latest/how-to-guides/manage-collections/#privacy-settings).
Private collections are not publicly accessible, and their contents are only available to users with the appropriate permissions.
## API access
Documents in Wagtail can be accessed through the API via the `wagtail.documents.api.v2.views.DocumentsAPIViewSet`. This allows you to programmatically interact with documents, retrieve their details, and perform various operations.
For more details, you can refer to the [API section](api_v2_configure_endpoints) that provides additional information and usage examples.