Code

Opened 7 months ago

Closed 7 months ago

Last modified 7 months ago

#21154 closed Bug (fixed)

`TemplateResponse` does not convert `Context` to `RequestContext`.

Reported by: mrmachine Owned by: nobody
Component: Template system Version: master
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?

Attachments (0)

Change History (5)

comment:1 Changed 7 months ago by FunkyBob

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

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.

comment:2 Changed 7 months ago by FunkyBob

I've written some additional docs in the pr:

https://github.com/django/django/pull/1694

comment:3 Changed 7 months ago by Tim Graham <timograham@…>

  • Resolution set to fixed
  • Status changed from new to closed

In c39c9f2ad8b2670d53ef845face67c29f3f4be3b:

Fixed #21154 -- Updated TemplateResponse docs to better explain context.

Thanks mrmachine for the report.

comment:4 Changed 7 months ago by Tim Graham <timograham@…>

In 98773c4bb53ff464c3782694f244e80158f975ee:

[1.6.x] Fixed #21154 -- Updated TemplateResponse docs to better explain context.

Thanks mrmachine for the report.

Backport of c39c9f2ad8 from master

comment:5 Changed 7 months ago by Tim Graham <timograham@…>

In 20f394f4d5a5e0b4647aac2dd7b5ab8dc89d36fa:

[1.5.x] Fixed #21154 -- Updated TemplateResponse docs to better explain context.

Thanks mrmachine for the report.

Backport of c39c9f2ad8 from master

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.