Extend register_model_view() to handle list views #10481

Closed
opened 2025-12-29 21:32:05 +01:00 by adam · 1 comment
Owner

Originally created by @jeremystretch on GitHub (Nov 15, 2024).

Originally assigned to: @jeremystretch on GitHub.

Proposed Changes

We currently use register_model_view() to register detail views (edit, delete, etc.) for models, which obviates the need to declare explicit URL paths for each. This could be extended to support list views as well. For example, a common set of views might look like this:

# List view
@register_model_view(MyModel, list=True)
class FooListView(generic.ObjectListView):

# Detail view
@register_model_view(MyModel)
class MyModelView(generic.ObjectView):

# Add/edit views
@register_model_view(MyModel, 'edit')
@register_model_view(MyModel, 'add', list=True)
class MyModelEditView(generic.ObjectEditView):

# Delete view
@register_model_view(MyModel, 'delete')
class MyModelDeleteView(generic.ObjectDeleteView):

# Bulk import view
@register_model_view(MyModel, 'import', list=True)
class MyModelBulkImportView(generic.BulkImportView):

# Bulk delete view
@register_model_view(MyModel, 'delete', list=True)
class MyModelBulkDeleteView(generic.BulkDeleteView):

The corresponding set of URL paths could then be reduced to:

path('my-models/', include(get_model_urls('myapp', 'mymodel', list=True))),
path('my-models/<int:pk>/', include(get_model_urls('myapp', 'mymodel'))),

(This could potentially be reduced even further, but I'm also wary of over-optimizing.)

get_model_urls() will likewise need to be extended to differentiate between list and detail views.

Justification

This will allow us to reduce a substantial amount of boilerplate URL patterns without any breaking changes (AFAICT).

Originally created by @jeremystretch on GitHub (Nov 15, 2024). Originally assigned to: @jeremystretch on GitHub. ### Proposed Changes We currently use `register_model_view()` to register detail views (edit, delete, etc.) for models, which obviates the need to declare explicit URL paths for each. This could be extended to support list views as well. For example, a common set of views might look like this: ```python # List view @register_model_view(MyModel, list=True) class FooListView(generic.ObjectListView): # Detail view @register_model_view(MyModel) class MyModelView(generic.ObjectView): # Add/edit views @register_model_view(MyModel, 'edit') @register_model_view(MyModel, 'add', list=True) class MyModelEditView(generic.ObjectEditView): # Delete view @register_model_view(MyModel, 'delete') class MyModelDeleteView(generic.ObjectDeleteView): # Bulk import view @register_model_view(MyModel, 'import', list=True) class MyModelBulkImportView(generic.BulkImportView): # Bulk delete view @register_model_view(MyModel, 'delete', list=True) class MyModelBulkDeleteView(generic.BulkDeleteView): ``` The corresponding set of URL paths could then be reduced to: ```python path('my-models/', include(get_model_urls('myapp', 'mymodel', list=True))), path('my-models/<int:pk>/', include(get_model_urls('myapp', 'mymodel'))), ``` (This could potentially be reduced even further, but I'm also wary of over-optimizing.) `get_model_urls()` will likewise need to be extended to differentiate between list and detail views. ### Justification This will allow us to reduce a substantial amount of boilerplate URL patterns without any breaking changes (AFAICT).
adam added the status: acceptedtype: featuretopic: pluginsnetbox labels 2025-12-29 21:32:05 +01:00
adam closed this issue 2025-12-29 21:32:05 +01:00
Author
Owner

@jeremystretch commented on GitHub (Nov 19, 2024):

Reclassifying this as a light feature request, as we expose register_model_view() in the plugins API.

@jeremystretch commented on GitHub (Nov 19, 2024): Reclassifying this as a light feature request, as we expose `register_model_view()` in the [plugins API](https://netboxlabs.com/docs/netbox/en/stable/plugins/development/views/#utilities.views.register_model_view).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#10481