Django’s field types are automatically recognised and provided with an appropriate widget for input. Just define that field the normal Django way and pass the field name into FieldPanel
when defining your panels. Wagtail will take care of the rest.
Here are some Wagtail-specific types that you might include as fields in your models.
This is a powerful but complex feature which will take some space to cover, so we’ll skip over it for now. For a full explanation on the usage of InlinePanel
, see Inline Panels and Model Clusters.
Note that you can use classname="collapsed"
to load the panel collapsed under its heading in order to save space in the Wagtail admin.
By adding CSS classes to your panel definitions or adding extra parameters to your field definitions, you can control much of how your fields will display in the Wagtail page editing interface. Wagtail’s page editing interface takes much of its behaviour from Django’s admin, so you may find many options for customisation covered there. (See Django model field reference).
Use classname="title"
to make Page’s built-in title field stand out with more vertical padding.
Changed in version 4.0: All panels are now collapsible by default.
Using classname="collapsed"
will load the editor page with the panel collapsed under its heading.
content_panels = [ MultiFieldPanel( [ FieldPanel('cover'), FieldPanel('book_file'), FieldPanel('publisher'), ], heading="Collection of Book Fields", classname="collapsed" ), ]
By default, Wagtail uses the field’s label as placeholder text. To change it, pass to the FieldPanel a widget with a placeholder attribute set to your desired text. You can select widgets from Django’s form widgets, or any of the Wagtail’s widgets found in wagtail.admin.widgets
.
For example, to customise placeholders for a Book model exposed via ModelAdmin:
# models.py from django import forms # the default Django widgets live here from wagtail.admin import widgets # to use Wagtail's special datetime widget class Book(models.Model): title = models.CharField(max_length=256) release_date = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) # you can create them separately title_widget = forms.TextInput( attrs = { 'placeholder': 'Enter Full Title' } ) # using the correct widget for your field type and desired effect date_widget = widgets.AdminDateInput( attrs = { 'placeholder': 'dd-mm-yyyy' } ) panels = [ FieldPanel('title', widget=title_widget), # then add them as a variable FieldPanel('release_date', widget=date_widget), FieldPanel('price', widget=forms.NumberInput(attrs={'placeholder': 'Retail price on release'})) # or directly inline ]
To make input or chooser selection mandatory for a field, add blank=False
to its model definition.
Without a panel definition, a default form field (without label) will be used to represent your fields. If you intend to hide a field on the Wagtail page editor, define the field with editable=False
.
The django-modelcluster
module allows for streamlined relation of extra models to a Wagtail page via a ForeignKey-like relationship called ParentalKey
. Normally, your related objects “cluster” would need to be created beforehand (or asynchronously) before being linked to a Page; however, objects related to a Wagtail page via ParentalKey
can be created on-the-fly and saved to a draft revision of a Page
object.
Let’s look at the example of adding related links to a Page
-derived model. We want to be able to add as many as we like, assign an order, and do all of this without leaving the page editing screen.
from wagtail.models import Orderable, Page from modelcluster.fields import ParentalKey # The abstract model for related links, complete with panels class RelatedLink(models.Model): title = models.CharField(max_length=255) link_external = models.URLField("External link", blank=True) panels = [ FieldPanel('title'), FieldPanel('link_external'), ] class Meta: abstract = True # The real model which combines the abstract model, an # Orderable helper class, and what amounts to a ForeignKey link # to the model we want to add related links to (BookPage) class BookPageRelatedLinks(Orderable, RelatedLink): page = ParentalKey('demo.BookPage', on_delete=models.CASCADE, related_name='related_links') class BookPage(Page): # ... content_panels = Page.content_panels + [ InlinePanel('related_links', heading="Related Links", label="Related link"), ]
The RelatedLink
class is a vanilla Django abstract model. The BookPageRelatedLinks
model extends it with capability for being ordered in the Wagtail interface via the Orderable
class as well as adding a page
property which links the model to the BookPage
model we’re adding the related links objects to. Finally, in the panel definitions for BookPage
, we’ll add an InlinePanel
to provide an interface for it all. Let’s look again at the parameters that InlinePanel
accepts:
InlinePanel(relation_name, panels=None, heading='', label='', help_text='', min_num=None, max_num=None)
The relation_name
is the related_name
label given to the cluster’s ParentalKey
relation. You can add the panels
manually or make them part of the cluster model. heading
and help_text
provide a heading and caption, respectively, for the Wagtail editor. label
sets the text on the add button and child panels, and is used as the heading when heading
is not present. Finally, min_num
and max_num
allow you to set the minimum/maximum number of forms that the user must submit.
For another example of using model clusters, see Tagging.
For more on django-modelcluster
, visit the django-modelcluster github project page
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/reference/pages/panels.html