mirror of
https://github.com/django-components/django-components.git
synced 2025-08-03 22:08:17 +00:00
Refactored Component class
# Conflicts: # README.md # pyproject.toml
This commit is contained in:
parent
55f46d6069
commit
5b9188cc9c
8 changed files with 91 additions and 111 deletions
|
@ -2,6 +2,7 @@ import warnings
|
|||
from functools import lru_cache
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.forms.widgets import MediaDefiningClass
|
||||
from django.template.base import Node, TokenType
|
||||
from django.template.loader import get_template
|
||||
|
@ -41,17 +42,21 @@ class SimplifiedInterfaceMediaDefiningClass(MediaDefiningClass):
|
|||
|
||||
|
||||
class Component(metaclass=SimplifiedInterfaceMediaDefiningClass):
|
||||
template_name = None
|
||||
|
||||
def __init__(self, component_name):
|
||||
self._component_name = component_name
|
||||
self.instance_template = None
|
||||
self.slots = {}
|
||||
|
||||
def context(self):
|
||||
return {}
|
||||
def get_context(self, *args, **kwargs):
|
||||
return kwargs
|
||||
|
||||
def template(self, context):
|
||||
raise NotImplementedError("Missing template() method on component")
|
||||
def get_template_name(self, context=None):
|
||||
if not self.template_name:
|
||||
raise ImproperlyConfigured(f'Template name is not set for Component {self.__class__.__name__}')
|
||||
|
||||
return self.template_name
|
||||
|
||||
def render_dependencies(self):
|
||||
"""Helper function to access media.render()"""
|
||||
|
@ -112,7 +117,21 @@ class Component(metaclass=SimplifiedInterfaceMediaDefiningClass):
|
|||
return component_template
|
||||
|
||||
def render(self, context):
|
||||
template_name = self.template(context)
|
||||
if hasattr(self, 'context'):
|
||||
warnings.warn(
|
||||
f'{self.__class__.__name__}: `context` method is deprecated, use `get_context` instead',
|
||||
DeprecationWarning
|
||||
)
|
||||
|
||||
if hasattr(self, 'template'):
|
||||
warnings.warn(
|
||||
f'{self.__class__.__name__}: `template` method is deprecated, set `template_name` or override `get_template_name` instead',
|
||||
DeprecationWarning
|
||||
)
|
||||
template_name = self.template(context)
|
||||
else:
|
||||
template_name = self.get_template_name(context)
|
||||
|
||||
instance_template = self.get_processed_template(template_name)
|
||||
with context.update({ACTIVE_SLOT_CONTEXT_KEY: self.slots}):
|
||||
return instance_template.render(context)
|
||||
|
|
|
@ -149,7 +149,7 @@ class ComponentNode(Node):
|
|||
# context method to get values to insert into the context
|
||||
resolved_context_args = [safe_resolve(arg, context) for arg in self.context_args]
|
||||
resolved_context_kwargs = {key: safe_resolve(kwarg, context) for key, kwarg in self.context_kwargs.items()}
|
||||
component_context = self.component.context(*resolved_context_args, **resolved_context_kwargs)
|
||||
component_context = self.component.get_context(*resolved_context_args, **resolved_context_kwargs)
|
||||
|
||||
# Create a fresh context if requested
|
||||
if self.isolated_context:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue