繁体   English   中英

登录后如何重定向 django.contrib.auth.views.login?

[英]How to redirect django.contrib.auth.views.login after login?

在网页的任何地方都添加了 django.contrib.auth.views.login,因为我必须在我的 base.html 中加载一个 模板标签(返回 AuthenticationForm)。 此模板标签包括registration/login.html模板。

登录工作正常,但我希望它将用户重定向到登录前的同一页面。 现在,它会将我重定向到 /wherever_i_am/login ,它显示了registration/login.html并显示“登录正常”或“登录失败”消息,但没有 base.ZFC35FDC70D5FC69D526 的 rest

我遵循了 django 文档和一些类似这样的 SO 问题,但我无法正确重定向。 我已经修改了next变量,但它似乎不起作用( next={{ request.get_full_path }}将我重定向到 /wherever_i_am/login...再次)

你试过类似的东西吗? 有任何想法吗?

UPDATE1现在,问题可能是这样的:如果我想在 web 页面的任何地方都包含登录表单,我是否必须声明自己的登录视图?

谢谢你。

找到答案:

在您的 settings.py 中更改 settings.LOGIN_REDIRECT_URL,

下面的代码是从 django 复制的:

   if request.method == "POST":
    form = authentication_form(data=request.POST)
    if form.is_valid():
        # Ensure the user-originating redirection url is safe.
        if not is_safe_url(url=redirect_to, host=request.get_host()):
            redirect_to = settings.LOGIN_REDIRECT_URL
   ...

下面允许将用户重定向到他们登录后尝试访问的页面,但无需编写自定义视图。 它包含您需要添加以使其工作的所有代码。 (顺便说一句,并不是所有的 TEMPLATE_CONTEXT_PROCESSORS 都是必需的,但如果你明确地为它设置一个值,你会覆盖默认值,所以需要重新添加它们。)

设置.py

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
    "django.core.context_processors.static",
)

网址.py

from django.contrib.auth.views import login, logout
...the other imports for your app ...

urlpatterns = patterns('',
    (r'^login/$', login, {'template_name':'login.html'} ),
    (r'^logout/$', logout,{'template_name':'logout.html'}),
    ...the other urls for your app...
)

登录.html

<html>
    <form method="post" action="{% url 'django.contrib.auth.views.login' %}">
        {% csrf_token %}
        {{form}}<br/>
       <input type="submit" value="login" />
       <input type="hidden" name="next" value="{{ next }}" />
   </form>
</html>

注销.html

<html>
<p>You are logged out. To log in again, click <a href="/login/">here</a>.</p> 
</html>

视图.py

@login_required(login_url="/login/")
def view1(request):
    ....this is a view you want to protect with security...

@login_required(login_url="/login/")
def view1(request):
    ....this is a view you want to protect with security...

我在默认登录视图中使用了类似的东西:

{% if form.errors %}
    <p class="error">Sorry, that's not a valid username or password</p>
{% endif %}

<form action="{% url login %}" method="post">
    {% csrf_token%}
    <label for="username">User name:</label>
    <input type="text" name="username" value="" id="username">
    <label for="password">Password:</label>
    <input type="password" name="password" value="" id="password">

    <input type="submit" value="login" />
    <input type="hidden" name="next" value="{{ request.get_full_path }}" />
</form>
    # or if it's not declareв шт urls:
     <form action="{% url django.contrib.auth.views.login %}?next={{ request.get_full_path }}" method="post">

一切正常。

PS:您绝对确定“context_processors.request”包含在设置中吗? 忘记包含它是一个常见问题。

UPD :据我所知,没有办法让默认登录视图在登录失败时重定向(它只是不能那样工作)。
我仍然可能是错的

最后,我创建了一个在内部调用 django.contrib.auth.views.login 的登录视图。

加起来@Sean 的回答 用于迭代每个表单字段的代码,以便在未键入的字段上方写入字段错误。

所以,在 Sean 的 login.html 是现有代码:

登录.html

<html>
    <form method="post" action="{% url 'django.contrib.auth.views.login' %}">
        {% csrf_token %}
        {{form}}<br/> <!-- I can change! -->
       <input type="submit" value="login" />
       <input type="hidden" name="next" value="{{ next }}" />
   </form>
</html>

现在你应该做的是用以下代码替换“我可以改变:”行(上面代码片段中的第 4 行):

{% for field in form %}

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <span class="text-danger small"> {{ field.errors }}</span>
        </div>
        <label class="control-label col-sm-2">{{ field.label_tag }}</label>
        <div class="col-sm-10"> {{ field }}</div>
    </div>

{% endfor %}

您也可以将此代码段用于其他 forms(例如注册)。 :)

我在实施 Facebook 帐户链接的过程中偶然发现了这个问题。 问题是一样的:登录成功后如何正确重定向django?

记住这一点:你的 settings.py 包含 LOGIN_REDIRECT_URL 对吗? 所以,这是你应该做重定向逻辑的唯一地方。 为此,首先连接这个信号(把它放在你的views.py中):

def after_success_login(sender, user, request, **kwargs):
   alt = request.GET.get('account_linking_token')
   if alt is not None:
       uri = request.GET.get('redirect_uri')
       request.session['fb_redirect_uri'] = uri
user_logged_in.connect(after_success_login)

上面的逻辑可能无法反映您的情况,但想法是设置一个 session 变量,以便在定义为 LOGIN_REDIRECT_URL 的路由中读取。

所以,就我而言:

def index(request):
  if not request.user.is_authenticated():
    form = SignUpForm()
    return render(request, 'index.html', {'form': form})
  else:
    # FB ACCOUNT LINKING!
    if 'fb_redirect_uri' in request.session:
        redirect_uri = request.session['fb_redirect_uri']
        del request.session['fb_redirect_uri']
        to = '{}&authorization_code={}'.format(redirect_uri, request.user.username)
        print('to', to)
        return redirect(to)

而已!

我建议将以前的 url 作为参数传递给 url:

/accounts/login/?next=my_previous_url

然后在视图中使用这个值

request.next

{{request.get_full_path}}为您提供当前路径,因此重定向指向同一个位置是正常的,在您的registration/login.html模板中将其更改为{{next}}

在视图 function 之前添加一个装饰器应该可以了。

@login_required

详情见这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM