2
2
from json import JSONDecodeError
3
3
from typing import Any , Awaitable , Callable , Dict , List , Optional , Sequence , Type , Union
4
4
5
- from jinja2 import ChoiceLoader , FileSystemLoader , PackageLoader
5
+ from jinja2 import ChoiceLoader , Environment , FileSystemLoader , PackageLoader
6
6
from starlette .applications import Starlette
7
7
from starlette .datastructures import FormData
8
8
from starlette .exceptions import HTTPException
@@ -190,13 +190,17 @@ def init_routes(self) -> None:
190
190
self ._views .append (self .index_view )
191
191
192
192
def _setup_templates (self ) -> None :
193
- templates = Jinja2Templates (self .templates_dir , extensions = ["jinja2.ext.i18n" ])
194
- templates .env .loader = ChoiceLoader (
195
- [
196
- FileSystemLoader (self .templates_dir ),
197
- PackageLoader ("starlette_admin" , "templates" ),
198
- ]
193
+ env = Environment (
194
+ loader = ChoiceLoader (
195
+ [
196
+ FileSystemLoader (self .templates_dir ),
197
+ PackageLoader ("starlette_admin" , "templates" ),
198
+ ]
199
+ ),
200
+ extensions = ["jinja2.ext.i18n" ],
199
201
)
202
+ templates = Jinja2Templates (env = env )
203
+
200
204
# globals
201
205
templates .env .globals ["views" ] = self ._views
202
206
templates .env .globals ["app_title" ] = self .title
@@ -374,9 +378,9 @@ async def _render_list(self, request: Request) -> Response:
374
378
if not model .is_accessible (request ):
375
379
raise HTTPException (HTTP_403_FORBIDDEN )
376
380
return self .templates .TemplateResponse (
377
- model . list_template ,
378
- {
379
- "request" : request ,
381
+ request = request ,
382
+ name = model . list_template ,
383
+ context = {
380
384
"model" : model ,
381
385
"title" : model .title (request ),
382
386
"_actions" : await model .get_all_actions (request ),
@@ -395,9 +399,9 @@ async def _render_detail(self, request: Request) -> Response:
395
399
if obj is None :
396
400
raise HTTPException (HTTP_404_NOT_FOUND )
397
401
return self .templates .TemplateResponse (
398
- model . detail_template ,
399
- {
400
- "request" : request ,
402
+ request = request ,
403
+ name = model . detail_template ,
404
+ context = {
401
405
"title" : model .title (request ),
402
406
"model" : model ,
403
407
"raw_obj" : obj ,
@@ -410,11 +414,15 @@ async def _render_create(self, request: Request) -> Response:
410
414
request .state .action = RequestAction .CREATE
411
415
identity = request .path_params .get ("identity" )
412
416
model = self ._find_model_from_identity (identity )
413
- config = {"request" : request , " title" : model .title (request ), "model" : model }
417
+ config = {"title" : model .title (request ), "model" : model }
414
418
if not model .is_accessible (request ) or not model .can_create (request ):
415
419
raise HTTPException (HTTP_403_FORBIDDEN )
416
420
if request .method == "GET" :
417
- return self .templates .TemplateResponse (model .create_template , config )
421
+ return self .templates .TemplateResponse (
422
+ request = request ,
423
+ name = model .create_template ,
424
+ context = config ,
425
+ )
418
426
form = await request .form ()
419
427
dict_obj = await self .form_to_dict (request , form , model , RequestAction .CREATE )
420
428
try :
@@ -427,8 +435,9 @@ async def _render_create(self, request: Request) -> Response:
427
435
}
428
436
)
429
437
return self .templates .TemplateResponse (
430
- model .create_template ,
431
- config ,
438
+ request = request ,
439
+ name = model .create_template ,
440
+ context = config ,
432
441
status_code = HTTP_422_UNPROCESSABLE_ENTITY ,
433
442
)
434
443
pk = await model .get_pk_value (request , obj )
@@ -452,14 +461,17 @@ async def _render_edit(self, request: Request) -> Response:
452
461
if obj is None :
453
462
raise HTTPException (HTTP_404_NOT_FOUND )
454
463
config = {
455
- "request" : request ,
456
464
"title" : model .title (request ),
457
465
"model" : model ,
458
466
"raw_obj" : obj ,
459
467
"obj" : await model .serialize (obj , request , RequestAction .EDIT ),
460
468
}
461
469
if request .method == "GET" :
462
- return self .templates .TemplateResponse (model .edit_template , config )
470
+ return self .templates .TemplateResponse (
471
+ request = request ,
472
+ name = model .edit_template ,
473
+ context = config ,
474
+ )
463
475
form = await request .form ()
464
476
dict_obj = await self .form_to_dict (request , form , model , RequestAction .EDIT )
465
477
try :
@@ -472,8 +484,9 @@ async def _render_edit(self, request: Request) -> Response:
472
484
}
473
485
)
474
486
return self .templates .TemplateResponse (
475
- model .edit_template ,
476
- config ,
487
+ request = request ,
488
+ name = model .edit_template ,
489
+ context = config ,
477
490
status_code = HTTP_422_UNPROCESSABLE_ENTITY ,
478
491
)
479
492
pk = await model .get_pk_value (request , obj )
@@ -493,8 +506,9 @@ async def _render_error(
493
506
) -> Response :
494
507
assert isinstance (exc , HTTPException )
495
508
return self .templates .TemplateResponse (
496
- "error.html" ,
497
- {"request" : request , "exc" : exc },
509
+ request = request ,
510
+ name = "error.html" ,
511
+ context = {"exc" : exc },
498
512
status_code = exc .status_code ,
499
513
)
500
514
0 commit comments