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

Posted

技术标签:

【中文标题】django 重定向到另一个带有上下文的视图【英文标题】:django redirect to another view with context 【发布时间】:2018-12-11 20:22:18 【问题描述】:

我有这个想法

def foo(request):

    context['bar'] = 'FooBar'

    return redirect('app:view')

当我重定向到'app:view' 时,有什么方法可以包含这个context['bar']?我最后的手段和替代方法是使用 render() 但是,我不想再次定义所有上下文变量。有没有其他方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

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

【讨论】:

这对我来说很好用。然而,这真的是最实用、最合适的解决方案吗? 实用,是的,合适的,嗯,这取决于您如何使用会话变量,因为它会在整个会话中持续存在。很难根据问题来判断是否合适。 我很想知道一个合适的通用解决方案是什么,如果不是这样的话。如果我想将上下文数据传递到不同的 URL 而不向 URL 本身添加 args,会话变量的替代方法是什么?例如,如果传递值列表或字典,则向 URL 添加 args 似乎不合适。 没用。我的页面重新加载了,但什么也没发生。 这段代码不会导致这种情况发生@AnonymousUser【参考方案2】:

在 django 中你不能通过重定向传递参数。您唯一的选择是将它们作为 URL 的一部分传递。

def foo(request):

    context['bar'] = 'FooBar'

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

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

【讨论】:

【参考方案3】:

你需要改用HttpResponseRedirect

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

【讨论】:

如果from django.shortcuts import redirect 的答案不是更好,这将是有意义的。这是较旧的方式。【参考方案4】:

我刚遇到同样的问题,这是我的解决方案。

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

【讨论】:

以上是关于django 重定向到另一个带有上下文的视图的主要内容,如果未能解决你的问题,请参考以下文章

Django 使用绑定表单重定向到另一个视图

重定向到另一个域的 Django 视图

React Hooks with React Router v4 - 我如何重定向到另一个路由?

django 1.10 一个带有链接的应用页面重定向到另一个应用页面

Django:如何通过 AJAX 将 PKID 列表传递给下一个视图,然后重定向

在 Django 1.6 中使用另一个 url slug 从视图重定向到另一个 html 页面