Site
and Application
two
viewsets helps to create website user interface and navigation.
A Site could contains several applications, and each application could contains several viewsets.
from viewflow.contrib.auth import AuthViewset
from viewflow.urls import Site, Application
site = Site(title="Workforce management", viewsets=[
Application(
title='Employees',
icon=Icon('people'),
app_name='emp',
viewsets=[
EmployeeViewset(),
DepartmentViewset(),
),
])
urlpatterns = [
path('accounts/', AuthViewset().urls),
path('', site.urls),
]
See also
see the AuthViewset
Current site and app variables are available in the template context as {{ request.resolver_match.site }} and {{ request.resolver_match.app }} Root viewflow/base.html template aliases it as {{ site }} and {{ app }} for later usage.
It’s common to have all application views templates extended from shared base template. Viewflow build-in templates extends `{[ app.base_template_name }}` that by default points to `viewflow/base_page.html`
See also
Built-in Templates override instructions
Site and Application automatically builds user navigation menu from included
viewsets. A viewset need to be included into application menu, should be mixed
with viewflow.urls.AppMenuMixin
from viewflow import Icon
from viewflow.urls import AppMenuMixin, Viewset
class EmployeeViewset(AppMenuMixin, Viewset):
title = _('Employee')
icon = Icon('people')
If you need to create a custom menu, override .menu_template_name attribute.
class EmpApplication(Application):
base_template_name = 'employees/base_page.html'
menu_template_name = 'employees/menu.html'
app_name = 'emp'
viewsets = [
EmployeeViewset(),
DepartmentViewset(),
]
And in ‘employees/menu.html’:
{% load viewflow_site %}
<vf-page-menu-navigation class="mdc-list">
<div class="mdc-list-group">
<h3 class="vf-page__menu-subheader mdc-list-group__subheader">Employees</h3>
<a class="mdc-list-item vf-page__menu-list-item"
href="{% url 'emp:employee:index' %}">
<i class="material-icons">account_box</i>Employees
</a>
<a class="mdc-list-item vf-page__menu-list-item"
href="{% url 'emp:department:index' %}">
<i class="material-icons">people</i>Departments
</a>
</div>
<div class="mdc-list-divider"></div>
</vf-page-menu-navigation>
To restrict access to site or application override .has_perm method
def has_perm(request, user):
return user.is_staff
To quickly change site colors, you can set primary_color and secondary_color attributes
site = Site(
title="Workforce management",
primary_color='#3949ab',
secondary_color='#5c6bc0',
viewsets=[
EmployeeViewset(),
DepartmentViewset(),
]
)