【发布时间】:2018-12-11 20:22:18
【问题描述】:
我有这个想法
def foo(request):
context['bar'] = 'FooBar'
return redirect('app:view')
当我重定向到'app:view' 时,有什么方法可以包含这个context['bar']?我最后的手段和替代方法是使用 render() 但是,我不想再次定义所有上下文变量。有没有其他方法可以解决这个问题?
【问题讨论】:
我有这个想法
def foo(request):
context['bar'] = 'FooBar'
return redirect('app:view')
当我重定向到'app:view' 时,有什么方法可以包含这个context['bar']?我最后的手段和替代方法是使用 render() 但是,我不想再次定义所有上下文变量。有没有其他方法可以解决这个问题?
【问题讨论】:
我会使用会话变量来通过重定向传递一些上下文。这是除了将它们作为 url 的一部分传递之外的唯一方法,它是推荐的 django 选项。
def foo(request):
request.session['bar'] = 'FooBar'
return redirect('app:view')
#jinja
{{ request.session.bar }}
指出了一个潜在的陷阱,而会话变量在未来的请求中会被错误地使用,因为它会在整个会话期间持续存在。如果是这种情况,您可以很容易地在以后的视图中规避此问题,因为它可能会通过添加再次使用。
if 'bar' in request.session:
del request.session['bar']
【讨论】:
在 django 中你不能通过重定向传递参数。您唯一的选择是将它们作为 URL 的一部分传递。
def foo(request):
context['bar'] = 'FooBar'
redirect(reverse('app:view', kwargs={ 'bar': FooBar }))
在您的 html 中,您可以从 URL 获取它们。
【讨论】:
你需要改用HttpResponseRedirect
from django.http import HttpResponseRedirect
return HttpResponseRedirect(reverse('app:view', kwargs={'bar':FooBar}))
【讨论】:
from django.shortcuts import redirect 的答案不是更好,这将是有意义的。这是较旧的方式。
我刚遇到同样的问题,这是我的解决方案。
我使用 Django 消息来存储我的参数。
在模板中,我没有使用模板标签{% for message in messages %} 阅读它,而是向我的 API 发出 POST 请求以检查是否有任何消息给我。
views.py
def foo(request):
messages.success(request, 'parameter')
return redirect('app:view')
api/views.py
@api_view(['POST'])
@login_required
def messageList(request):
data = {}
messageList = []
storage = messages.get_messages(request)
for message in storage:
msgObj = makeMessage(message.message, tag=message.level_tag)
messageList.append(msgObj['message'])
data['messages'] = messageList
return Response(data)
【讨论】: