As standard, Wagtail organises panels for pages into three tabs: 'Content', 'Promote' and 'Settings'. For snippets Wagtail puts all panels into one page. Depending on the requirements of your site, you may wish to customise this for specific page types or snippets - for example, adding an additional tab for sidebar content. This can be done by specifying an `edit_handler` attribute on the page or snippet model. For example:
```python
from wagtail.admin.panels import TabbedInterface, ObjectList
Wagtail provides a general-purpose WYSIWYG editor for creating rich text content (HTML) and embedding media such as images, video, and documents. To include this in your models, use the `RichTextField` function when defining a model field:
`RichTextField` inherits from Django's basic `TextField` field, so you can pass any field parameters into `RichTextField` as if using a normal Django field. Its `max_length` will ignore any rich text formatting. This field does not need a special panel and can be defined with `FieldPanel`.
By default, the rich text editor provides users with a wide variety of options for text formatting and inserting embedded content such as images. However, we may wish to restrict a rich text field to a more limited set of features - for example:
- The field might be intended for a short text snippet, such as a summary to be pulled out on index pages, where embedded images or videos would be inappropriate;
- When page content is defined using [StreamField](../../topics/streamfield), elements such as headings, images and videos are usually given their own block types, alongside a rich text block type used for ordinary paragraph text; in this case, allowing headings and images to also exist within the rich text content is redundant (and liable to result in inconsistent designs).
This can be achieved by passing a `features` keyword argument to `RichTextField`, with a list of identifiers for the features you wish to allow:
```python
body = RichTextField(features=['h2', 'h3', 'bold', 'italic', 'link'])
```
The feature identifiers provided on a default Wagtail installation are as follows:
-`h1`, `h2`, `h3`, `h4`, `h5`, `h6` - heading elements
-`bold`, `italic` - bold / italic text
-`ol`, `ul` - ordered / unordered lists
-`hr` - horizontal rules
-`link` - page, external and email links
-`document-link` - links to documents
-`image` - embedded images
-`embed` - embedded media (see [](embedded_content))
We have few additional feature identifiers as well. They are not enabled by default, but you can use them in your list of identifiers. These are as follows:
-`code` - inline code
-`superscript`, `subscript`, `strikethrough` - text formatting
-`blockquote` - blockquote
The process for creating new features is described in the following pages:
On loading, Wagtail will search for any app with the file `image_formats.py` and execute the contents. This provides a way to customise the formatting options shown to the editor when inserting images in the `RichTextField` editor.
As an example, add a "thumbnail" format:
```python
# image_formats.py
from wagtail.images.formats import Format, register_image_format
To begin, import the `Format` class, `register_image_format` function, and optionally `unregister_image_format` function. To register a new `Format`, call the `register_image_format` with the `Format` object as the argument. The `Format` class takes the following constructor arguments:
**`name`**
The unique key used to identify the format. To unregister this format, call `unregister_image_format` with this string as the only argument.
**`label`**
The label used in the chooser form when inserting the image into the `RichTextField`.
**`classnames`**
The string to assign to the `class` attribute of the generated `<img>` tag.
```{note}
Any class names you provide must have CSS rules matching them written separately, as part of the front end CSS code. Specifying a `classnames` value of `left` will only ensure that class is output in the generated markup, it won't cause the image to align itself left.
```
**`filter_spec`**
The string specification to create the image rendition. For more, see [](image_tag).
To unregister, call `unregister_image_format` with the string of the `name` of the `Format` as the only argument.
```{warning}
Unregistering ``Format`` objects will cause errors viewing or editing pages that reference them.