#21154 closed Bug (fixed)
`TemplateResponse` does not convert `Context` to `RequestContext`.
| Reported by: | Tai Lee | Owned by: | nobody |
|---|---|---|---|
| Component: | Template system | Version: | dev |
| Severity: | Normal | Keywords: | TemplateResponse Context RequestContext |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
The docs say that TemplateResponse is a subclass of SimpleTemplateResponse that uses RequestContext instead of Context. It also says that context data can be provided as a dict or as a Context object. However, if a Context object is given as context data, it is left as-is and is not converted to a RequestContext object in TemplateResponse.resolve_context().
Either the docs should be changed to reflect that users must pass a dict or RequestContext (and validate this in code), or the code should be updated to convert Context to RequestContext objects. I would suggest the latter, even though it may be an edge case.
If a user wants to use TemplateResponse and they are passed a Context object from somewhere (maybe 3rd party code), there appears to be no user-friendly way to convert it to RequestContext themselves before passing to TemplateResponse. You can't do RequestContext(request, context_object). It seems you would need to iterate through context_object.dicts and assign each key/value to a new empty RequestContext object in order, or perhaps just context.dicts across.
Perhaps updating RequestContext to allow Context objects as data, and checking isinstance(context, RequestContext) in TemplateResponse.resolve_context() would be a good idea?
Change History (5)
comment:1 by , 12 years ago
comment:3 by , 12 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Personally, I think it would be better to document this.
If you pass a dict, it will be "upgraded" to a RequestContext.
If you took the trouble to build a Context, it's assumed you did so for a reason.