django-components/docs/concepts/fundamentals/http_request.md
Juro Oravec 314ec77d3d
docs: Syntax highlighting for mkdocs (#984)
* feat:forward context processors variables in context in ISOLATED mode

	provide context_processors_data property to Component to access those variables in Component

* refactor: internalize RequestContext and pass HttpRequest internally

* docs: document HttpRequest and context processors

* docs: use djc_py code blocks for component definitions

---------

Co-authored-by: Lilian Durey <dureylilian@gmail.com>
2025-02-20 11:47:14 +01:00

3.5 KiB

title weight
HTTP Request 11

The most common use of django-components is to render HTML for a given request. As such, there are a few features that are dependent on the request object.

Passing and accessing HttpRequest

In regular Django templates, the request object is available only within the RequestContext.

In Components, you can either use RequestContext, or pass the request object explicitly to Component.render() and Component.render_to_response().

When a component is nested in another, the child component uses parent's request object.

You can access the request object under Component.request:

class MyComponent(Component):
    def get_context_data(self):
        return {
            'user_id': self.request.GET['user_id'],
        }

# ✅ With request
MyComponent.render(request=request)
MyComponent.render(context=RequestContext(request, {}))

# ❌ Without request
MyComponent.render()
MyComponent.render(context=Context({}))

Context Processors

Components support Django's context processors.

In regular Django templates, the context processors are applied only when the template is rendered with RequestContext.

Components allow you to pass the request object explicitly. Thus, the context processors are applied to components either when:

  • The component is rendered with RequestContext (Regular Django behavior)
  • The component is rendered with a regular Context (or none), but you set the request kwarg of Component.render().
  • The component is nested in another component that matches one of the two conditions above.
# ❌ No context processors
rendered = MyComponent.render()
rendered = MyComponent.render(Context({}))

# ✅ With context processors
rendered = MyComponent.render(request=request)
rendered = MyComponent.render(Context({}), request=request)
rendered = MyComponent.render(RequestContext(request, {}))

When a component is rendered within a template with {% component %} tag, context processors are available depending on whether the template is rendered with RequestContext or not.

template = Template("""
<div>
  {% component "MyComponent" / %}
</div>
""")

# ❌ No context processors
rendered = template.render(Context({}))

# ✅ With context processors
rendered = template.render(RequestContext(request, {}))

Accessing context processors data

The data from context processors is automatically available within the component's template.

class MyComponent(Component):
    template = """
        <div>
            {{ csrf_token }}
        </div>
    """

MyComponent.render(request=request)

You can also access the context processors data from within get_context_data() and other methods under Component.context_processors_data.

class MyComponent(Component):
    def get_context_data(self):
        csrf_token = self.context_processors_data['csrf_token']
        return {
            'csrf_token': csrf_token,
        }