Establish render() method on ObjectAction

This commit is contained in:
Jeremy Stretch 2025-07-21 10:34:12 -04:00
parent 59e1d3a607
commit 8793d42b7f
2 changed files with 10 additions and 7 deletions

View File

@ -1,3 +1,4 @@
from django.template import loader
from django.urls import reverse from django.urls import reverse
from django.urls.exceptions import NoReverseMatch from django.urls.exceptions import NoReverseMatch
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -27,12 +28,14 @@ class ObjectAction:
Params: Params:
name: The action name appended to the module for view resolution name: The action name appended to the module for view resolution
label: Human-friendly label for the rendered button label: Human-friendly label for the rendered button
template_name: Name of the HTML template which renders the button
multi: Set to True if this action is performed by selecting multiple objects (i.e. using a table) multi: Set to True if this action is performed by selecting multiple objects (i.e. using a table)
permissions_required: The set of permissions a user must have to perform the action permissions_required: The set of permissions a user must have to perform the action
url_kwargs: The set of URL keyword arguments to pass when resolving the view's URL url_kwargs: The set of URL keyword arguments to pass when resolving the view's URL
""" """
name = '' name = ''
label = None label = None
template_name = None
multi = False multi = False
permissions_required = set() permissions_required = set()
url_kwargs = [] url_kwargs = []
@ -49,11 +52,13 @@ class ObjectAction:
return return
@classmethod @classmethod
def get_context(cls, context, obj): def render(cls, obj, **kwargs):
return { context = {
'url': cls.get_url(obj), 'url': cls.get_url(obj),
'label': cls.label, 'label': cls.label,
**kwargs,
} }
return loader.render_to_string(cls.template_name, context)
class AddObject(ObjectAction): class AddObject(ObjectAction):

View File

@ -1,6 +1,5 @@
from django import template from django import template
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.template import loader
from django.urls import NoReverseMatch, reverse from django.urls import NoReverseMatch, reverse
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -29,11 +28,10 @@ __all__ = (
register = template.Library() register = template.Library()
@register.simple_tag(takes_context=True) @register.simple_tag
def action_buttons(context, actions, obj, multi=False): def action_buttons(actions, obj, multi=False, **kwargs):
buttons = [ buttons = [
loader.render_to_string(action.template_name, action.get_context(context, obj)) action.render(obj, **kwargs) for action in actions if action.multi == multi
for action in actions if action.multi == multi
] ]
return mark_safe(''.join(buttons)) return mark_safe(''.join(buttons))