Django:如何在默认身份验证/登录代码之后添加步骤

Django:如何在默认身份验证/登录代码之后添加步骤,django,Django,我正在构建我的第一个Django项目,我一直很感激现代框架中提供了身份验证步骤,但我很难看到如何/在何处自定义登录过程以在幕后执行额外的步骤 我按照教程使用Django身份验证,一切都很好。我制作了一个registration/login.html页面,其中包括“下一步”供用户选择。我在mysite/url.py中包含了用于身份验证的Django URL: urlpatterns = [ path('familytree/', include('familytree.urls')),

我正在构建我的第一个Django项目,我一直很感激现代框架中提供了身份验证步骤,但我很难看到如何/在何处自定义登录过程以在幕后执行额外的步骤

我按照教程使用Django身份验证,一切都很好。我制作了一个registration/login.html页面,其中包括“下一步”供用户选择。我在mysite/url.py中包含了用于身份验证的Django URL:

urlpatterns = [
    path('familytree/', include('familytree.urls')),
    path('admin/', admin.site.urls, name='admin'),
    path('accounts/', include('django.contrib.auth.urls')),
]
  • 在settings.py中,我指定希望用户在登录后转到仪表板页面:

    登录\重定向\ URL='仪表板'

    注销\u重定向\u URL='landing'


问题:我想添加另一个步骤:在用户成功进行身份验证后,在新的登录表中创建一个记录(然后让他们继续进入仪表板)。我已经了解了如何编写自己的身份验证后端,但我想我只想扩展现有的默认身份验证。添加此步骤的正确位置在哪里?起初,我想我可以将登录地址改为其他步骤(然后转到仪表板),但我想要的不是真正的URL。。。。不确定中间件是否更合适?或者是否有某种方式可以扩展登录代码以添加此其他操作?

首先,查看是否需要此操作。在每次新登录时,Django都会更新用户模型上的上次登录。如果这真的与你想要的不同,请继续阅读

您可以覆盖并重新实现
LoginView
的表单\u

首先,我们创建一个新的应用程序来处理身份验证。我们将只覆盖一个位,并将其余部分委托给django.contrib.auth,但我们可能希望在将来覆盖更多,因此让我们将其组织得井井有条

因此,创建新的应用程序myauth:
python./manage.py startapp myauth

并将其添加到“设置”中已安装的应用程序中:

已安装的应用程序=[
...
“myauth”,
]
现在编辑standard views.py
#myauth/views.py

from django.contrib.auth.views import LoginView as BaseLoginView
from django.utils import timezone
from myauth.models import LoginAudit


class LoginView(BaseLoginView):
    def form_valid(self, form):
        # A redirect is just a HttpResponse, so you can grab and hold it
        response = super().form_valid(form)
        LoginAudit.objects.create(user=self.request.user, logged_in_at=timezone.now())
        # And then release
        return response
和URL
#myauth/url.py

from django.contrib.auth.views import LoginView as BaseLoginView
from django.utils import timezone
from myauth.models import LoginAudit


class LoginView(BaseLoginView):
    def form_valid(self, form):
        # A redirect is just a HttpResponse, so you can grab and hold it
        response = super().form_valid(form)
        LoginAudit.objects.create(user=self.request.user, logged_in_at=timezone.now())
        # And then release
        return response
从django.url导入路径
从django.contrib.auth导入视图作为auth_视图
从…起为清晰起见,将视图导入为“我的授权视图”
URL模式=(
path('login/',my_auth_views.LoginView.as_view(),name='login'),
路径('logout/',auth_views.LogoutView.as_view(),name='logout'),
#…见以下网址的列表:
# https://docs.djangoproject.com/en/3.2/topics/auth/default/#using-观点
)
最后是您的根URL配置:

#mysite/url.py

from django.contrib.auth.views import LoginView as BaseLoginView
from django.utils import timezone
from myauth.models import LoginAudit


class LoginView(BaseLoginView):
    def form_valid(self, form):
        # A redirect is just a HttpResponse, so you can grab and hold it
        response = super().form_valid(form)
        LoginAudit.objects.create(user=self.request.user, logged_in_at=timezone.now())
        # And then release
        return response
从django.url导入包括,路径
URL模式=(
...
路径('accounts/',include('myauth.url'))
...
)
为完整起见,LoginAudit模型:

#myauth/models.py

from django.contrib.auth.views import LoginView as BaseLoginView
from django.utils import timezone
from myauth.models import LoginAudit


class LoginView(BaseLoginView):
    def form_valid(self, form):
        # A redirect is just a HttpResponse, so you can grab and hold it
        response = super().form_valid(form)
        LoginAudit.objects.create(user=self.request.user, logged_in_at=timezone.now())
        # And then release
        return response
来自django.db导入模型的

从django.contrib.auth.models导入用户
类登录编辑(models.Model):
user=models.ForeignKey(用户,在\u delete=models.CASCADE上,相关的\u name='login\u事件')
logged_in_at=models.DateTimeField(null=True,blank=True)
#当然,您也可以覆盖LogoutView()并设置此字段:)
#注销时间=models.DateTimeField(null=True,blank=True)

您可以创建自己的登录视图,该视图继承了django标准登录视图,但添加了任何所需的额外功能谢谢!这听起来不错,但当我搜索类似的内容时,我一直在寻找有关如何自定义视图模板的信息,以自定义用户看到的内容,但我在幕后寻找一些东西:一个函数(类似views.py的地方),可以定义在标准身份验证成功后保存新记录,在用户到达登录\u重定向\u URL之前。关于在哪里可以找到这样的例子,有什么建议吗?这看起来正是我需要的!非常感谢你花时间把这个放在一起-我会试试的!嘿,Melvyn-我遇到了一点小麻烦,我想确定我的位置是否正确:新的“myauth”目录是否应该是我的项目目录的同级目录,在模板下?myauth是一个新的应用程序,很抱歉,我忘了这一点。它可以工作!非常感谢。