有没有办法给Django的反向函数添加上下文?

xwbd5t1u  于 2023-02-05  发布在  Go
关注(0)|答案(2)|浏览(116)

在Django中,是否可以像reverse('foo', context={'bar':'baz'})那样通过reverse函数传递上下文?或者是否有更好的解决方案?

vi4fp9gy

vi4fp9gy1#

正如WillemVanOnsem先生在上面的评论中所描述的那样。
不能反向提供context,因为它只生成一个字符串:一条路径,最终它会进入视图。
reverse()只能接受argskwargs,有关详细信息,请参阅反转命名空间URL。

db2dz4w8

db2dz4w82#

反向生成URL。URL可以解析或提供额外的上下文。在www.example.com中urls.py,

path( 'action/<str:context>/', MyView.as_view(), name='foo' )

那么

reverse('app:foo', kwargs={'context':'bar:baz+quux:help'} )

将生成URL结尾

.../appname/action/bar:baz+quux:help

视图将解析上下文:

context = self.kwargs.get( context, '')
context_dir = {}
for kv in context.split('+'):
   keyval = kv.split(':')
   context_dir[ keyval[0].strip() ] = keyval[1].strip()

或者类似于下面的代码,以context_dir结尾,即{'bar':'baz', 'quux':'help'}
或者,您可以将querystring附加到reverse返回的URL,并在通过request重定向到的视图中检索该URL。GET

url = reverse('foo') + '?bar=baz&quux=help'

重定向,然后在该视图中request.GET.get('bar')将返回"baz"等。
最后,你可以将一个几乎任意复杂的上下文填充到用户的会话中(它可以存储为浏览器中的cookie,也可以存储为数据库中的对象)。这是最通用的,但也是最复杂的。

相关问题