在Django中,是否可以像reverse('foo', context={'bar':'baz'})那样通过reverse函数传递上下文?或者是否有更好的解决方案?
reverse('foo', context={'bar':'baz'})
vi4fp9gy1#
正如WillemVanOnsem先生在上面的评论中所描述的那样。不能反向提供context,因为它只生成一个字符串:一条路径,最终它会进入视图。reverse()只能接受args和kwargs,有关详细信息,请参阅反转命名空间URL。
context
reverse()
args
kwargs
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
{'bar':'baz', 'quux':'help'}
url = reverse('foo') + '?bar=baz&quux=help'
重定向,然后在该视图中request.GET.get('bar')将返回"baz"等。最后,你可以将一个几乎任意复杂的上下文填充到用户的会话中(它可以存储为浏览器中的cookie,也可以存储为数据库中的对象)。这是最通用的,但也是最复杂的。
request.GET.get('bar')
"baz"
2条答案
按热度按时间vi4fp9gy1#
正如WillemVanOnsem先生在上面的评论中所描述的那样。
不能反向提供
context
,因为它只生成一个字符串:一条路径,最终它会进入视图。reverse()
只能接受args
和kwargs
,有关详细信息,请参阅反转命名空间URL。db2dz4w82#
反向生成URL。URL可以解析或提供额外的上下文。在www.example.com中urls.py,
那么
将生成URL结尾
视图将解析上下文:
或者类似于下面的代码,以context_dir结尾,即
{'bar':'baz', 'quux':'help'}
或者,您可以将querystring附加到reverse返回的URL,并在通过request重定向到的视图中检索该URL。GET
重定向,然后在该视图中
request.GET.get('bar')
将返回"baz"
等。最后,你可以将一个几乎任意复杂的上下文填充到用户的会话中(它可以存储为浏览器中的cookie,也可以存储为数据库中的对象)。这是最通用的,但也是最复杂的。