Django认证登录页修改:如何从指定应用视图获取数据库数据展示
Django多应用共用登录页加载其他应用数据实现方案
方案1:重写统一登录视图(最推荐,适配性最高)
你所有应用共用登录页的前提下,直接替换Django默认的登录视图,在自定义视图里查询你需要的其他应用数据即可:
- 首先在你存放登录逻辑的
loginapplication的views.py中,导入其他应用的模型/已封装的业务取数方法,继承Django原生登录视图扩展上下文:
from django.contrib.auth.views import LoginView # 替换为你要取数的对应应用的模型、业务方法 from your_target_app.models import TargetModel class CommonLoginView(LoginView): # 指定你的共用登录模板路径 template_name = 'loginapplication/login_page.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 这里按你的业务需求查询数据库数据,和普通视图取数逻辑完全一致 dataFromDatabase = TargetModel.objects.filter(过滤条件).all() # 把数据写入模板上下文,和你给出的示例逻辑完全匹配 context['datafromdatabase'] = dataFromDatabase return context
- 然后修改项目根目录的
urls.py,把全局登录路由指向你自定义的视图,保证所有应用跳转的登录页都是这个扩展后的版本:
from loginapplication.views import CommonLoginView urlpatterns = [ # 替换原有默认的登录路由 path('accounts/login/', CommonLoginView.as_view(), name='login'), # 其余原有路由保持不变 ]
配置完成后直接在login_page.html中用{{ datafromdatabase }}就可以遍历展示对应数据。
方案2:使用全局上下文处理器(适合多页面复用该数据的场景)
如果你要展示的这个数据不止登录页要用,其他页面也会频繁用到,可以用上下文处理器实现全局注入,不需要修改登录视图:
- 在
loginapplication下新建context_processors.py文件,写入如下逻辑:
from your_target_app.models import TargetModel def inject_login_data(request): # 只对登录页请求返回额外数据,避免所有请求都查询数据库浪费性能 if request.path == '/accounts/login/': dataFromDatabase = TargetModel.objects.filter(过滤条件).all() return {'datafromdatabase': dataFromDatabase} return {}
- 打开
settings.py,找到TEMPLATES配置项,把你写的处理器加入上下文处理器列表:
TEMPLATES = [ { # 原有其他配置保持不变 'OPTIONS': { 'context_processors': [ # 原有默认的上下文处理器不要删除,末尾追加你的处理器 'loginapplication.context_processors.inject_login_data', ], }, }, ]
配置完成后登录模板也可以直接读取datafromdatabase变量。
小提示:如果取数逻辑已经在其他应用的视图里封装完成,不需要重复写逻辑,直接导入对应函数调用取返回值即可。
内容的提问来源于stack exchange,提问作者darwhite
相关产品推荐
相关产品推荐

