Есть ли способ добавить контекст к обратной функции Django?
Возможно ли в Django передать контекст через обратную функцию каким-то образом, как reverse('foo', context={'bar':'baz'})
? Или есть лучший обходной путь?
Как уже описал сэр WillemVanOnsem в приведенном выше комментарии.
Вы не можете предоставить context
в обратном направлении, так как он выдает только строку: путь, в конечном итоге он переходит в view.
reverse()
может принимать только args
и kwargs
, подробнее см. в Reversing namespaced URLs
Reverse генерирует URL. URL может разбираться или предоставлять дополнительный контекст. В urls.py,
path( 'action/<str:context>/', MyView.as_view(), name='foo' )
then
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'}
В качестве альтернативы вы можете добавить строку запроса к URL, возвращаемому реверсом, и получить ее в представлении, на которое вы перенаправляетесь через request.GET
url = reverse('foo') + '?bar=baz&quux=help'
redirect, и тогда в этом представлении request.GET.get('bar')
будет возвращаться "baz"
и т.д.
Наконец, вы можете запихнуть почти произвольно сложный контекст в сессию пользователя (которая хранится либо как cookie в браузере, либо как объект в вашей базе данных). Это самый общий, но и самый сложный вариант. Смотрите документацию по использованию сессий Django