Configuration¶
Bread views are configured similar to some other class-based views, by subclassing and setting attributes on the subclasses, then instantiating one and adding it to your URL config.
The main class to subclass is Bread
:
class MyBreadView(Bread):
attrib1 = something
attrib2 = somethingelse
then you can add it to a URL config something like this:
path('', include(MyBreadView().get_urls())),
See also URLs.
Bread configuration¶
There are a lot of things that can be configured, so they’re somewhat
organized by which views they affect. Any parameter that affects
multiple views (e.g. browse, read, edit) is set on what we’ll call
the main
class, that is, the class that is a subclass of Bread
.
Here are some of those common parameters.
- model (required)
- The model class
- get_additional_context_data
Override this method to add data to the template context for all views. You must include the data provided by Bread too, e.g.:
def get_additional_context_data(self): context = super().get_additional_context_data() context['my_var'] = compute_my_value() return context
- exclude
- A list of names of fields to always exclude from any form classes that Bread generates itself. (Not used for any views that have a custom form class provided.)
- form_class
- A model form class that Bread should use instead of generating one itself. Can also be overridden on individual views that use forms.
- name
- A string to use in url names, permissions, etc. Defaults to the model’s
name, lowercased. Example: If the model class is
MyModel
, the default name would bemymodel
. See also URLs and Templates. - plural_name
- A string to use as the plural name where needed (see
name
, URLs, and Templates). Default: the name with ans
appended. - namespace
- A string with the URL namespace to include in the generated URLS. Default is ‘’. See also URLs.
- views
- A string containing the first letters of the views to include. Default is ‘BREAD’. Any omitted views will not have URLs defined and so will not be accessible.
Example:
class MyBreadView(Bread):
model = MyModel
form_class = MyModelForm
views = 'BRD'
Configuring individual views¶
To set things that only affect one view, subclass the default base class for that view and set attributes on it, then configure the main bread subclass to use your view subclass by setting these attributes:
- browse_view
- Use this class for the browse view. Default: bread.BrowseView
- read_view
- Use this class for the read view. Default: bread.ReadView
- edit_view
- Use this class for the edit view. Default: bread.EditView
- add_view
- Use this class for the add view. Default: bread.AddView
- delete_view
- Use this class for the delete view. Default: bread.DeleteView
Example:
class MyBrowseView(bread.BrowseView):
param1 = value1
param2 = value2
class MyBreadView(Bread):
attrib1 = something
attrib2 = somethingelse
browse_view = MyBrowseView
Common view configuration parameters¶
These can be set on any individual view class.
- perm_name
The base permission name needed to access the view. Defaults are ‘browse’, ‘view’, ‘edit’, ‘add’, and ‘delete’. Then _ and the lowercased model name are appended to get the complete permission name that a user must have to access the view. E.g. if your model is MyModel and you leave the default perm_name on the browse view, the user must have browse_mymodel permission.
(Note that the permission for the “read” view is “view”, not “read”. It’s a little confusing in this context, but “view” is what Django decided on for its standard read-only permission.)
- template_name_suffix
- The default string that the template this view uses will end with. Defaults are ‘_browse’, ‘_read’, ‘_edit’, ‘_edit’ (not ‘_add’), and ‘_delete’. See also Templates.
Browse view configuration¶
Subclass bread.BrowseView and set these parameters.
BrowseView is itself a subclass of Vanilla’s ListView.
- columns
- Iterable of (‘Title’, ‘attrname’) pairs to customize the columns in the browse view. ‘attrname’ may include ‘__’ to drill down into fields, e.g. ‘user__name’ to get the user’s name, or ‘type__get_number_display’ to call get_number_display() on the object from the type field. (Assumes the default template, obviously). ‘attrname’ may also be a dunder method like __unicode__ or __len__.
- filterset
- filterset class to use to control filtering. Must be a subclass of django-filters’ django_filters.FilterSet class.
- paginate_by
- Limit browsing to this many items per page, and add controls to navigate among pages.
- search_fields
If set, enables search. Value is a list or tuple like the same field on the Django admin.
This also enables display of a search input box in the default browse template.
If there’s a GET query parameter named
q
, then its value will be split into words, and results will be limited to those that contain each of the words in at least one of the specified fields, not case sensitive.For example, if search_fields is set to [‘first_name’, ‘last_name’] and a user searches for john lennon, Django will do the equivalent of this SQL WHERE clause:
WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%') AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
To customize the search behavior, you can override the
get_search_results
method on the browse view, which has the same signature and behavior as the same method in the admin.- search_terms
- If set, should be translated text listing the data fields that the search will
apply to. For example, if your
search_fields
are['name', 'phone', 'manager__name']
, then you might setsearch_terms
to_('name, phone number, or manager's name')
. Thensearch_terms
will be available in the browse template context to help the user understand how their search will work. - sorting
The default browse template will include sort controls on the column headers for columns that are sortable.
It’s a good idea to define a default ordering in the model’s
Meta
class. After applying any sort columns specified by the user, Bread will add on any default orderings not already mentioned. That will result in the overall sort being stable, which is important if you want pagination to be sensible. (Otherwise, every time we show a new page, we could be working off a different sorting of the results!) If nothing else, include a sort on the primary key.If you do not have control of the model and so cannot change its ordering there, you can add a
default_ordering
attribute to the browse view. Bread will use that if present, instead of the model’s ordering.Configuring the browse view:
If the second item in the
columns
entry for a column is not a valid specification for sorting on that column (e.g. it might refer to a method on the model), then you can add a third item to that column entry to provide a sort spec. E.g.('Office', 'name', 'name_english')
.Alternatively, if the second item in the
columns
entry for a column is valid for sorting, but you don’t want the table to be sortable on that column, add a third item with a value ofFalse
, e.g.('Date', 'creation_date', False)
.Query parameters:
If there’s a GET query parameter named
o
, then its value will be split on commas, and each item should be a column number (0-based) optionally prefixed with ‘-’. Any column whose number is included with ‘-’ will be sorted descending, while any column whose number is included without ‘-’ will be sorted ascending. The first column mentioned will be the primary sort column and so on.(Typically links are generated for you by Bread’s Javascript, so you don’t have to come up with these query parameters yourself.)
Template context variables:
If there’s an
o
query parameter, there will be ano
variable in the template context containing the value of it. Otherwise, theo
variable will exist but contain an empty string.There will be a context variable named
valid_sorting_columns_json
which is a JSON string containing a list of the indexes of the columns that are valid to sort on.If you’re not using the default bread templates or at least
bread/includes/browse.html
, be sure to give yourth
elements a class ofcol_header
and to include this javascript snippet:<script> var o_field = "{{o}}", valid_sorting_columns = JSON.parse("{{ valid_sorting_columns_json }}"); </script>
Styling:
Any
th
element on a column that can be sorted will have thesortable
CSS class added to it, in case you want to style it differently.Additionally, a
th
element on a column that is sorted ascending will have thesort_asc
class, or if sorted descending thesort_desc
class, or if sortable but not current sorted, theunsorted
class.Also, the
th
will have an attribute added,sort_column
, whose value will be1
on the primary sort column,2
on the secondary sort column, etc.This allows styling the columns with CSS like this:
th.sortable.unsorted::after { content: "\00A0▲▼"; opacity: 0.2; } table th.sortable.sortasc::after { content: "\00A0(" attr(sort_column) "▲)"; } table th.sortable.sortdesc::after { content: "\00A0(" attr(sort_column) "▼)"; }
which will put ” (1▲)” after the header on the primary sorting column if it’s ascending, etc.
Read view configuration¶
Subclass bread.ReadView and set these parameters.
ReadView itself is a subclass of Vanilla’s DetailView.
- exclude
- A list of names of fields to always exclude from any form classes that Bread generates itself. Not used in this view if a custom form class is provided. If specified, replaces exclude from the BreadView subclass.
- form_class
- specify a custom form class to use for this model in this view
Alternate read view configuration¶
The default read view uses a form to describe which fields to display. If you would rather have more flexibility, subclass bread.LabelValueReadView and set these parameters.
LabelValueReadView is a subclass of ReadView.
- fields
A list of 2-tuples of (label, evaluator) where the evaluator is reference to an object attribute, an object method, a function, or one of a few other options. In addition, the label can be automatically generated for you in some cases.
See the class docstring for full details.
Edit view configuration¶
Subclass bread.EditView and set these parameters.
EditView itself is a subclass of Vanilla’s UpdateView.
- exclude
- A list of names of fields to always exclude from any form classes that Bread generates itself. Not used in this view if a custom form class is provided. If specified, replaces exclude from the BreadView subclass.
- form_class
- specify a custom form class to use for this model in this view
Add view configuration¶
Subclass bread.AddView and set these parameters.
AddView itself is a subclass of Vanilla’s CreateView.
- exclude
- A list of names of fields to always exclude from any form classes that Bread generates itself. Not used in this view if a custom form class is provided. If specified, replaces exclude from the BreadView subclass.
- form_class
- specify a custom form class to use for this model in this view