Есть ли способ добавить контекст к обратной функции 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

Вернуться на верх