如何在管理员面板中首次登录django员工用户?

时间:2017-12-15 06:25:32

标签: python django django-admin

我正在开发一个django项目,我正在使用默认的auth应用程序进行身份验证 我知道用户模型中有一个last_login字段,用于存储用户的上次登录时间。

当员工用户第一次登录管理面板时,我想检查last_login字段是否为空&将他重定向到更改密码页面。

我应该把这张支票放在哪里?

<小时/> 到目前为止我尝试了什么:

我尝试使用自定义登录表单并覆盖默认的confirm_login_allowed方法,但似乎我只能提出验证错误以阻止使用这些登录尝试。

我也尝试使用django.contrib.auth.signals.user_logged_in信号,但在last_loginNone时,我也不允许我返回重定向回复。

我想知道在用户通过身份验证后如何返回重定向响应。

3 个答案:

答案 0 :(得分:3)

使用replaceFirst自定义Django管理员,并使用login_form属性为管理员登录页面提供自定义登录表单。

admin.py

AdminSite

urls.py

当覆盖管理员时,我们必须摆脱Django默认管理员

class MyAdminSite(AdminSite):
    login_form = CustomAdminLoginForm

admin_site = MyAdminSite(name='myadmin')
admin_site.register(User)
admin_site.register(Group

forms.py

AuthenticationFormfrom app.admin import admin_site url(r'^admin/', admin_site.urls) 方法使用此方法授予登录或不登录的权限。

confirm_login_allowed

注意:这种方法需要考虑很多边缘情况。

  1. 如果用户未在第一时间设置密码以及您将如何处理第二次尝试该怎么办?这次last_long不是没有。虽然class CustomAdminLoginForm(AuthenticationForm): def confirm_login_allowed(self, user): if user.last_login: raise ValidationError(mark_safe('Hey first time user please reset your password here... <a href="/test">test</a>'), code='inactive') 来救援。 date_joined
  2. 但是,如果用户未在第一天设置密码并在第二天进行设置,该怎么办?
  3. 编辑:

    您可以使用信号检查登录用户并在此处应用last_login == date_joined逻辑...?

    config_login_allowed

答案 1 :(得分:3)

Django管理员不是那么可配置的。你应该挂钩它的内部视图。登录/注销视图位于Django AdminSite类(您通常由admin.site访问的类)中。我的实现有点hacky但很小:

粘贴在urls.py

的顶部
from django.contrib import admin
from django.contrib.admin import AdminSite
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

class MyAdminSite(AdminSite):
    def login(self, request, extra_context=None):
        new_user = False
        user = None

        username = request.POST.get('username')  # Hack to find user before its last_login set to now.
        if username:
            user = User.objects.filter(username=username).first()
            if user:
                new_user = user.last_login is None

        r = super(MyAdminSite, self).login(request, extra_context)

        if new_user and request.user == user and isinstance(r, HttpResponseRedirect):  # Successful logins will result in a redirect.
            return HttpResponseRedirect(reverse('admin:password_change'))
        return r

admin.site = MyAdminSite()

如果你想要一个更清洁的解决方案,我建议使用布局内部用户模型,而不是依赖last_login,这样你就可以检查request.user而不是我的黑客进入request.POST

您可以阅读AdminSite.logindjango.contrib.auth.views.login,了解Django内部实际发生的情况。

答案 2 :(得分:0)

这对我来说是一个大问题。我找到了一种简单的方法。创建另一个变量,以在用户尝试登录时保存已登录用户的值。

下面是我的代码:

if user.last_login is None:
   auth.login(request,user)
   return redirect(alertPassword) 

# when user is login for the first time it will pass a value

else:
   auth.login(request,user)
   return redirect(moveToLogin)

def moveToLogin(request):
   return render(request,"home.html")

def alertPassword(request):
   first_login=True
   return render(request,"home.html",{"first_login":first_login})
#it will pass a value to the template called first login is True

然后转到您的模板并添加以下内容:

{% if first_login==True%}
# Put anything you want to be done 
# In my case I wanted to open a new window by using script.
<script>

    window.open("popUpWindow")

</script>
{%endif%}