django重定向到带有上下文的另一个视图

时间:2018-07-03 13:32:57

标签: django redirect render

我认为这是

def foo(request):

    context['bar'] = 'FooBar'

    return redirect('app:view')

当我重定向到context['bar']时,是否可以通过某种方式包括此'app:view'?我的最后一个选择是使用render(),但是,我不想再次定义所有上下文变量。还有其他方法吗?

4 个答案:

答案 0 :(得分:4)

我将使用会话变量,以便通过重定向传递某些上下文。这是在将它们作为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']

答案 1 :(得分:3)

在Django中,您无法通过重定向传递参数。您唯一的选择就是将它们作为URL的一部分传递。

def foo(request):

    context['bar'] = 'FooBar'

    redirect(reverse('app:view', kwargs={ 'bar': FooBar }))

在您的html中,您可以从URL获取它们。

答案 2 :(得分:1)

您需要使用HttpResponseRedirect代替

from django.http import HttpResponseRedirect
return HttpResponseRedirect(reverse('app:view', kwargs={'bar':FooBar)

答案 3 :(得分:0)

我只是遇到了同样的问题,这是我的解决方法。

我使用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)