在Django项目中重写LoginView添加记住我功能及属性咨询
在Django Auth中为LoginView添加「记住我」功能
可以通过form_class属性结合自定义视图的方式实现需求,不需要完全重写LoginView的核心逻辑,步骤如下:
1. 自定义登录表单
在你的forms.py中创建继承自AuthenticationForm的自定义表单,添加「记住我」复选框字段:
from django.contrib.auth.forms import AuthenticationForm from django import forms class LoginForm(AuthenticationForm): remember_me = forms.BooleanField( required=False, initial=True, label="记住我" )
2. 自定义LoginView处理「记住我」逻辑
在views.py中创建继承自auth_views.LoginView的自定义视图,重写form_valid方法根据勾选状态设置会话有效期:
from django.contrib.auth.views import LoginView from django.urls import reverse_lazy from .forms import LoginForm class CustomLoginView(LoginView): form_class = LoginForm template_name = "account/login.html" # 指定自定义登录模板 success_url = reverse_lazy("account:dashboard") # 登录成功后跳转地址 def form_valid(self, form): # 获取表单中「记住我」的勾选状态 remember_me = form.cleaned_data.get("remember_me") # 先执行父类的登录逻辑 response = super().form_valid(form) # 根据勾选状态设置会话有效期 if remember_me: # 勾选则设置会话有效期为14天(与Django默认SESSION_COOKIE_AGE一致) self.request.session.set_expiry(60 * 60 * 24 * 14) else: # 不勾选则会话随浏览器关闭而过期 self.request.session.set_expiry(0) return response
3. 更新urls.py中的登录路由
将原来的auth_views.LoginView.as_view()替换为自定义视图:
# 替换前的旧代码 # path('login/', auth_views.LoginView.as_view(), name='login'), # 替换后的新代码 path('login/', views.CustomLoginView.as_view(), name='login'),
4. 自定义登录模板
在templates/account/login.html中渲染表单,确保「记住我」字段正常显示:
{% extends "base.html" %} {% block content %} <h2>登录</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">登录</button> </form> {% endblock %}
内容的提问来源于stack exchange,提问作者MMEEUR
相关产品推荐
相关产品推荐

