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

JM *_*toc 7 django redirect render

我有这个看法

def foo(request):

    context['bar'] = 'FooBar'

    return redirect('app:view')
Run Code Online (Sandbox Code Playgroud)

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

Mit*_*lls 19

我会使用会话变量来通过重定向传递一些上下文。这是除了将它们作为 url 的一部分传递之外的唯一方法,它是推荐的 django 选项。

def foo(request):
    request.session['bar'] = 'FooBar'
    return redirect('app:view')

#jinja
{{ request.session.bar }}
Run Code Online (Sandbox Code Playgroud)

指出了一个潜在的缺陷,而会话变量在未来的请求中被错误地使用,因为它在整个会话期间持续存在。如果是这种情况,您可以很容易地在将来的视图中通过添加再次使用它来规避此问题。

if 'bar' in request.session:
    del request.session['bar']
Run Code Online (Sandbox Code Playgroud)


Oja*_*ale 11

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

def foo(request):

    context['bar'] = 'FooBar'

    redirect(reverse('app:view', kwargs={ 'bar': FooBar }))
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我也遇到了同样的问题。我想重定向到另一个页面并显示一些消息,就我而言,这是一条错误消息。为了解决这个问题,我使用了 django 消息:https://docs.djangoproject.com/en/4.0/ref/contrib/messages/

我这样做了:

    def foo(request):
        message.error(request, 'bla bla bla')
        return redirect('foo_page')
Run Code Online (Sandbox Code Playgroud)

在我的模板 foo_page.html 中:

    {% if messages %}
       {% for message in messages %}
       <div class={{ message.tags }}>{{ message }}</div>
       {% endfor %}
    {% endif %}
Run Code Online (Sandbox Code Playgroud)