Material Design for Django

  • By Viewflow
  • Last update: Jan 4, 2023
  • Comments: 17

Django Material

Material design for Django.

Join the chat at https://gitter.im/viewflow/django-material
  • Django-Material 1.10.x compatible with Django 2.2/3.0/3.1/3.2/4.0
  • Django-Material 1.[8,9].x compatible with Django 1.11/2.0/2.1/2.2/3.0/3.1/3.2
  • Django-Material 1.7.x compatible with Django 1.11/2.0/2.1/2.2/3.0/3.1
  • Django-Material 1.6.x compatible with Django 1.11/2.0/2.1/2.2/3.0
  • Django-Material 1.[3,4,5].x compatible with Django 1.11/2.0/2.1/2.2
  • Django-Material 1.2.x compatible with Django 1.11/2.0
  • Django-Material 1.1.x compatible with Django 1.8/1.9/1.10/1.11

Tested with:

demo/static/img/browserstack_small.png

Overview

  • Forms - New way to render django forms
    • Strong python/html code separation
    • Easy redefinition of particular fields rendering
    • Complex form layout support
  • Frontend - Quick starter template for modular admin-line applications development

.screen.png

Demo

http://forms.viewflow.io/

To checkout and run open source demo version locally, you need to have git and tox tools installed.

git clone https://github.com/viewflow/django-material.git
cd django-material

TOXENV=py36-dj111 tox -- python manage.py migrate --settings=demo.settings
TOXENV=py36-dj111 tox -- python manage.py loaddata demo/fixtures/* --settings=demo.settings
TOXENV=py36-dj111 tox -- python manage.py runserver --settings=demo.settings

Then you can go to http://127.0.0.1:8000/integration/ and login with admin:admin username and password to the demo site.

Documentation

http://docs.viewflow.io/material_forms.html

License

Django Material is an Open Source project licensed under the terms of the BSD3 license

Django Material Pro with additional features has a commercial-friendly license. Check http:viewflow.io/pro/ for details.

Changelog

1.10.0 2021-11-12

  • Drop support for python 2.7
  • Drop support for Django 1.11, Django 2.0, Django 2.1
  • Add support for Django 4.0
  • Keep viewset.queryset for detai and delete views
  • Improve multiple ajax select
  • Speed up model List View

Github

https://github.com/viewflow/django-material

Comments(17)

  • 1

    Invalid template name in 'extends' tag: ''. Got this from the 'current_module.base_template' variable.

    hello guys, I created a module with manage.py startmodule applitest and i leave all by default and i uncomment default code in (models.py, urls.py and views.py) and everything was fine. But when go to localhost:8000/applitest/mymodel/ it throws TemplateSyntaxError.

  • 2

    Make list_actions consistent between ModelViewSet and ListMovelView

    ModelViewSet accepts list of tuples in format:

    list_actions = [
        ('Delete objects', DeleteView)
    ]
    

    Whereas the ListMovelView accepts in format:

    list_actions = [
        ('Delete objects', 'delete_view_url')
    ]
    

    A relatively easy fix should be to simply move the _get_actions, get_action_view_kwargs and get_action_view from ModelViewSet into ListMovelView because as default ModelViewSet uses ListMovelView as its list_view_class anyway. This would make it possible to use list_actions in ListMovelView with passing the view directly into it, rather than reversing the url regardless of whether the ListMovelView is used from ModelViewSet or independently.

    EDIT: Additionally, it would be nice to have template_name default to {model_name}_action_{action_name}.html (through get_template_names)

    EDIT 2: A has_action_permission should be added to BaseActionView which defaults to not requiring any permission. This makes it easy to e.g. restrict delete action to people with model's can_delete permission (which makes sense).

  • 3

    Foreign Key Popup not opening in a new window

    Hi,

    When I've got a foreign key field, it's possible to "add" a new foreign key value. Normally with Django, it opens a new browser (target=blank).

    However, with Material, it just opens a new page- meaning you leave the original model you were trying to edit.

    I made a screenshot which should make more sense.

    Not sure if this is a one-off bug for me, or a project wide-issue...

    2016-06-28 at 3 21 10 pm

  • 4

    AjaxModelSelect OPTIONS header issue

    OPTIONS header is used for CORS and cannot be trusted for data transfer in request body.

    Eg. on AWS lambda request body is cleared with OPTIONS header. I've managed to override this by reading body from wsgi: request_body = request.environ['wsgi.input']

    Sadly, this is not the solution. Microsoft Edge 16 doesn't send request body with OPTIONS request. So AJAX widget is not usable on Edge at all. After all component should be using POST or GET for this. I suggest using POST with some kind of parameter and provide backward compatibility for OPTIONS. In JS with autocompleter initialization provide parametrization:

    var autocompleteType = <setting>;  // <-- this should be OPTIONS or POST. OPTIONS for backward compatibility.
    var url = '.';
    if (autocompleteType === "POST") {
       url = '.?autocomplete';
    }
    (...)
    .devbridgeAutocomplete({
      (...)
      serviceUrl: url,
      showNoSuggestionNotice: true,
      type: autocompleteType
    })
    

    That way we could use POST method for both POSTs and autocompletes using URL param.

  • 5

    v2: publish npm package

    Perhaps components from https://github.com/viewflow/django-material/tree/v2/material/static/material/components could be installed with npm install django-material, do you think this will be possible ?

  • 6

    When I click an item in dropdown selector , the item won't be selected

    for example ,in http://forms.viewflow.io/demo/bank/, when I click America in Nationality, America won't be choosed. My browser is Google Chrome v61.0.3163.100.

  • 7

    Contributing by adding formsets: little bit of guidance

    Hi! First of all: awesome project, first thing i thought about when I learned about Google's Material design.

    I don't have an issue but I didn't know where to put this, so I figured I'd do it here.

    I'd like to build out some missing parts of the Admin, I want it in one of my projects and would love to be able to offer this design to my clients. I've forked and integrated the project as a dev version in a current project, and ran into the missing formsets thing and I'd like to start there!

    I was hoping someone could point me in the right direction for adding formsets, it would save me quite some time figuring out how the Admin internals work. If not, no problem, I'll do it anyway but it'll take me a little bit longer :) I'll take a look at the issues as well to see if I can fix a couple of them while I'm at it.

    I'd be happy to write a small contributing guide in the process to try to give the project a boost.

    Let me know if help is welcome!

  • 8

    Drop admin styling

    Unfortunately, i can't no longer support django-material admin custom theme. But it's not so bad

    • Django 2.0 got responsive mobile interface.
    • There are a lot of issues in the django-material admin customization
    • No paying customer interest in the custom admin

    I going to spend more efforts on the material.frontend improvements. Frontend going to be complete, more flexible and customizable django-admin replacement.

    --

    • [x] drop admin templates
    • [ ] remove django-material from admin-styling grid on djangopackages
  • 9

    CheckboxSelectMultiple not displaying checkboxes

    I'm using a ModelForm, my 'Person' model has a ManyToMany relationship with 'Problem' and I've set the form to show checkboxes as so

    class PersonForm(forms.ModelForm):
        class Meta:
            model = Person
            exclude = ('',)
            widgets = {
                'problems': forms.CheckboxSelectMultiple(),
            }
    

    But it doesn't show checkboxes with Material Form, instead it shows a MultipleSelect With Material

    Removing the Material template shows up the checkboxes Without Material

  • 10

    404 error when trying to add a related (FK) object

  • 11

    Selecting an item in datatable, going to next page and trying to perform action - the action is not performed on the item from previous page.

    If we select an item on page 1 of datatable, go to page 2 and select 1 more item, then try to perform action (e.g. delete), the action is performed only on the 1 item from second page.

    See: https://i.imgur.com/apEHsr8.gif

    Edit: I've made a quick demo from version django-material-pro-1.1.3 and it works as expected there. I select 1 item on first page, 1 item on second page. Both items are accessible through JS and are passed to delete action.

    See: https://i.imgur.com/zFgqhNi.gif As you can see the same JS function returns only the 'current page' item on the up to date django-material version: https://i.imgur.com/KGHkQ0L.gif

    This is not intended, this is the standard behaviour of DataTables and I don't see why would it relate to materializecss itself.

  • 12

    Bump json5 from 2.2.0 to 2.2.3

    Bumps json5 from 2.2.0 to 2.2.3.

    Release notes

    Sourced from json5's releases.

    v2.2.3

    v2.2.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)
    Changelog

    Sourced from json5's changelog.

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)
    Commits
    • c3a7524 2.2.3
    • 94fd06d docs: update CHANGELOG for v2.2.3
    • 3b8cebf docs(security): use GitHub security advisories
    • f0fd9e1 docs: publish a security policy
    • 6a91a05 docs(template): bug -> bug report
    • 14f8cb1 2.2.2
    • 10cc7ca docs: update CHANGELOG for v2.2.2
    • 7774c10 fix: add proto to objects and arrays
    • edde30a Readme: slight tweak to intro
    • 97286f8 Improve example in readme
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 13

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 14

    Bump nth-check and cssnano

    Bumps nth-check and cssnano. These dependencies needed to be updated together. Updates nth-check from 1.0.2 to 2.1.1

    Release notes

    Sourced from nth-check's releases.

    v2.1.1

    • The ESM code had some issues that are now fixed aeeb067

    https://github.com/fb55/nth-check/compare/v2.1.0...v2.1.1

    v2.1.0

    What's Changed

    • nth-check is now a dual CommonJS and ESM module fb55/nth-check#206
    • With the new sequence and generate methods, it is now possible to generate a sequence of indices for a given formula fb55/nth-check#207

    Full Changelog: https://github.com/fb55/nth-check/compare/v2.0.1...v2.1.0

    v2.0.1

    Fixes:

    • Replace regex with hand-rolled parser for nth-expressions (#9) 9894c1d
      • Ensures parsing will always have linear time complexity.

    Internal:

    • chore(ci): Use GitHub Actions, Dependabot (#10) e02b4dd
    • Bump dependencies

    https://github.com/fb55/nth-check/compare/v2.0.0...v2.0.1

    v2.0.0

    • Port module to TS, Jest, ESLint

    Breaking:

    • The main export is now a default export.
    • The module now throws regular Errors on invalid selectors instead of SyntaxErrors.
    Commits

    Updates cssnano from 4.1.11 to 5.1.13

    Release notes

    Sourced from cssnano's releases.

    v5.1.13

    Bug Fixes

    v5.1.12

    Bug Fixes

    v5.1.11

    Bug Fixes

    • postcss-ordered-values: preserve constant values (32ab4d9b7d20d)

    v5.1.10

    Bug Fixes

    v5.1.9

    Bug Fixes

    • postcss-merge-longhand: preserve more color function fallbacks (712993cb4a4e0)

    v5.1.8

    Bug Fixes

    • postcss-convert-values: preserve percentage sign on IE 11 (57f060ad21734)

    v5.1.6

    Bug Fixes

    • preserve border color when merging border properties (5f5080a)

    v5.1.4

    Bug Fixes

    • postcss-merge-longhand: preserve custom property case (5428d5fc9)

    v5.1.3

    Bug Fixes

    • fix: do not merge declarations containing custom properties when it might create invalid declarations (2c699341)

    v5.1.2

    Bug fixes

    • preserve empty custom properties and ensure they work in Chrome (4ed39679)

    v5.1.0

    New Feature

    Add TypeScript types

    v5.0.17

    Patch Changes

    ... (truncated)

    Commits
    • d6e3d82 Publish cssnano 5.1.13
    • b92dbe3 Fix cssnanoPlugin type to return Processor not Plugin
    • 1b6e4ec chore: downgrade uvu to check if Node.js tests pass
    • 8ee9287 chore: update development dependencies
    • 48f0397 chore: update TypeScript and re-generate types
    • 789474f docs: update website dependencies
    • 335f532 chore: update prettier and reformat
    • 4a8f54a Publish cssnano 5.1.12
    • 0a3a133 fix(cssnano-preset-default): update css-declaration-sorter
    • 120a888 fix(postcss-merge-longhand): preserve hyphenated custom property case
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 15

    Bump yargs-parser from 5.0.0-security.0 to 5.0.1

    Bumps yargs-parser from 5.0.0-security.0 to 5.0.1.

    Changelog

    Sourced from yargs-parser's changelog.

    5.0.1 (2021-03-10)

    Bug Fixes

    • security: address GHSA-p9pc-299p-vxgp (#362) (1c417bd)

    4.2.1 (2017-01-02)

    Bug Fixes

    4.2.0 (2016-12-01)

    Bug Fixes

    • inner objects in configs had their keys appended to top-level key when dot-notation was disabled (#72) (0b1b5f9)

    Features

    • allow multiple arrays to be provided, rather than always combining (#71) (0f0fb2d)

    4.1.0 (2016-11-07)

    Features

    • apply coercions to default options (#65) (c79052b)
    • handle dot notation boolean options (#63) (02c3545)

    4.0.2 (2016-09-30)

    Bug Fixes

    • whoops, let's make the assign not change the Object key order (29d069a)

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 16

    Bump terser from 4.8.0 to 4.8.1

    Bumps terser from 4.8.0 to 4.8.1.

    Changelog

    Sourced from terser's changelog.

    v4.8.1 (backport)

    • Security fix for RegExps that should not be evaluated (regexp DDOS)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 17

    django.urls.exceptions.NoReverseMatch: Reverse for 'cameramodel_add' not found.

    I've started trying to reimplement a UI with django-material again from scratch. I'm running into an error and I've put quite a lot of time into trying to figure it out, but I can't make progress.

    I assume cameramodel_add has the _add suffix automatically added by the ModelViewSet, but somehow the autoloading isn't working?

    • the parent app is camerahub
    • the app which contains an existing models.py is schema
    • the app which contains a skeleton Material project is ui

    The schema app used to contain a bunch of views I wrote myself, but I have now deleted everything apart from models.py and the migrations.

    # camerahub/urls.py
    
    from django.contrib import admin
    from django.urls import include, path
    from material.frontend import urls as frontend_urls
    
    urlpatterns = [
        path('', include(frontend_urls)),
        path('', include('schema.urls')),
        path('api/', include('api.urls')),
        path('admin/', admin.site.urls),
        path('accounts/', include('django_registration.backends.activation.urls')),
        path('accounts/', include('django.contrib.auth.urls')),
        path('', include('django_prometheus.urls')),
        path('ratings/', include('star_ratings.urls', namespace='ratings')),
        path('health/', include('health_check.urls')),
    ]
    
    # ui/urls.py
    
    from unicodedata import name
    from django.urls import path, include
    from django.views import generic
    
    from . import views
    
    
    urlpatterns = [
        path('', generic.TemplateView.as_view(template_name="index.html"), name="index"),
        path('cameramodel/', include(views.CameraModelViewSet().urls)),
    ]
    
    # ui/views.py
    
    from material.frontend.views import ModelViewSet
    
    from schema import models
    
    # class MyModelViewSet(ModelViewSet):
    #    model = models.MyModel
    
    class CameraModelViewSet(ModelViewSet):
        model = models.CameraModel
    

    Trying to browse to http://127.0.0.1:8000/ui/cameramodel/ I get

    Internal Server Error: /ui/cameramodel/
    Traceback (most recent call last):
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
        response = get_response(request)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/views/generic/base.py", line 70, in view
        return self.dispatch(request, *args, **kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/utils/decorators.py", line 43, in _wrapper
        return bound_method(*args, **kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
        return view_func(request, *args, **kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/material/frontend/views/list.py", line 531, in dispatch
        return super(ListModelView, self).dispatch(request, *args, **kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/material/frontend/views/list.py", line 357, in dispatch
        return handler(request, *args, **kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/material/frontend/views/list.py", line 315, in get
        context = self.get_context_data()
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/material/frontend/views/list.py", line 521, in get_context_data
        kwargs['add_url'] = reverse('{}:{}_add'.format(opts.app_label, opts.model_name))
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/urls/base.py", line 86, in reverse
        return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
      File "/home/jonathan/.cache/pypoetry/virtualenvs/camerahub-FNy4MBnC-py3.10/lib/python3.10/site-packages/django/urls/resolvers.py", line 698, in _reverse_with_prefix
        raise NoReverseMatch(msg)
    django.urls.exceptions.NoReverseMatch: Reverse for 'cameramodel_add' not found. 'cameramodel_add' is not a valid view function or pattern name.
    "GET /ui/cameramodel/ HTTP/1.1" 500 117163
    

    Originally posted by @djjudas21 in https://github.com/viewflow/django-material/issues/513#issuecomment-1110268057