1

我对 Django 很陌生,我即将结束django 女孩教程。我在视图中的 post_detail 上方添加了“@login_required”(用于单击特定帖子的视图)并添加了 login.html 模板。所以当我点击一个帖子标题时,我会被重定向到我的登录页面(到目前为止,一切都很好),网址是:http: //127.0.0.1 :8000/accounts/login/?next=/post/11/ (在我的电脑自动取款机上试试这个。)

然后我输入我的管理员名称/密码并自动重定向到http://127.0.0.1:8000/accounts/profile/并且当然得到“找不到页面(404)”(因为我没有 url/view/模板)。我想“该死,我只是想被重定向到 /post/11/”!

环顾堆栈溢出,发现了这个问题:
Signing in lead to "/accounts/profile/" in Django (sounds about right)
并得到了答案

在您的 settings.py 中更改 LOGIN_REDIRECT_URL 的值。

所以我在 Django 文档中查找了 LOGIN_REDIRECT_URL:

默认值:'/accounts/profile/'

当 contrib.auth.login 视图没有获得 next 参数时,请求在登录后被重定向的 URL 。

例如,它由 login_required() 装饰器使用。

此设置还接受命名 URL 模式,可用于减少配置重复,因为您不必在两个位置(设置和 URLconf)定义 URL。

1.8 版后已弃用:该设置也可能是视图函数的虚线 Python 路径。对此的支持将在 Django 1.10 中删除。

但是我的 contrib.auth.login 没有得到下一个参数吗?(看看我的网址,最后说“?next=/post/11/”)请在这里帮帮我,我对这里可能出现的问题感到迷茫:(

您可以在以下位置查看页面:http:
//finbel.pythonanywhere.com/
和源代码在:
https ://github.com/Finbel/my-first-blog

更新(1):
所以我现在知道 LOGIN_REDIRECT_URL 是决定我下一步在哪里结束的东西,这必须意味着它忽略了 url 中的下一个参数。我进一步搜索了这个问题,发现这个问题与我的问题非常相似,即

文档说明我需要使用“下一个”参数和上下文处理器。我的模板中有 {{next}},但我对如何实际传递“/gallery/(username)”感到困惑。任何帮助将不胜感激。

(我的模板中什至没有 {{next}},我应该在哪里/如何添加它?)

该问题的首选答案似乎是:

Django 的登录视图 django.contrib.auth.views.login 接受一个名为 extra_context 的字典。字典中的值直接传递给模板。所以你可以用它来设置下一个参数。完成后,您可以设置一个名为 next 和 value {{ next }} 的隐藏字段,以便它在模板中呈现。

但我不确定如何解释这一点。在编写此编辑时,我在这篇文章(由 kacperd)上得到了答案,现在将通读)

4

1 回答 1

7

问题是contrib.auth.login没有得到下一个参数。当您尝试在没有凭据的情况下获取 login_required 视图时,您的请求将重定向到登录视图,并呈现您创建的模板。该next参数存在于此视图中,但是当您执行提交表单的登录操作时,您没有包含next在您的请求中,因此contrib.auth.login不会获取它并重定向到默认页面。

您的问题的解决方案是包含next参数并将其传递。您可以通过修改登录模板来做到这一点。只需添加?next={{ request.GET.next }}到表单操作属性。

<form method="post" action="{% url 'django.contrib.auth.views.login' %}?next={{ request.GET.next }}">
于 2016-03-25T09:36:38.760 回答