SQLAdmin项目自定义视图开发指南

SQLAdmin项目自定义视图开发指南

sqladmin SQLAlchemy Admin for FastAPI and Starlette sqladmin 项目地址: https://gitcode.com/gh_mirrors/sq/sqladmin

什么是SQLAdmin自定义视图

SQLAdmin是一个强大的数据库管理界面工具,它允许开发者通过Python代码快速构建功能丰富的数据库管理后台。在实际项目中,我们经常需要扩展默认的管理界面功能,比如添加数据报表、自定义表单或特殊操作页面,这时就需要使用SQLAdmin的自定义视图功能。

自定义视图基础实现

创建基本视图类

SQLAdmin提供了BaseView基类,开发者可以继承它来创建自定义视图。下面是一个简单的报表视图示例:

from sqladmin import BaseView, expose

class ReportView(BaseView):
    name = "Report Page"  # 在导航栏中显示的名称
    icon = "fa-solid fa-chart-line"  # 使用的Font Awesome图标

    @expose("/report", methods=["GET"])
    async def report_page(self, request):
        return await self.templates.TemplateResponse(request, "report.html")

admin.add_view(ReportView)

这段代码会创建一个新的报表页面,访问路径为/admin/report。注意以下几点:

  1. name属性定义导航栏显示名称
  2. icon属性指定图标,使用Font Awesome类名
  3. @expose装饰器定义路由路径和允许的HTTP方法
  4. 最后需要通过admin.add_view()注册视图

模板文件配置

默认情况下,SQLAdmin会在项目根目录下的templates文件夹中查找模板文件。如果需要自定义模板目录,可以在初始化Admin对象时指定:

from sqladmin import Admin

admin = Admin(templates_dir="my_templates", ...)

模型视图扩展

除了独立视图,我们还可以为现有的模型视图添加自定义端点:

from sqladmin import ModelView, expose

class UserView(ModelView):
    @expose("/profile/{pk}", methods=["GET"])
    async def profile(self, request):
        user = await self.get_object_for_edit(request)
        return await self.templates.TemplateResponse(
            request, "user.html", {"user": user}
        )

admin.add_view(UserView)

这种方式的路径会自动包含模型前缀,如/admin/user/profile/1get_object_for_edit是SQLAdmin提供的便捷方法,用于获取指定主键的模型实例。

数据库操作实践

在实际应用中,我们通常需要在自定义视图中访问数据库。下面是一个完整的示例,展示如何在视图中执行SQL查询:

from sqlalchemy import Column, Integer, String, select, func
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.ext.asyncio import AsyncSession
from sqladmin import Admin, BaseView, expose

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String(length=16))

class ReportView(BaseView):
    name = "Report Page"
    icon = "fa-solid fa-chart-line"

    @expose("/report", methods=["GET"])
    async def report_page(self, request):
        async with Session(expire_on_commit=False) as session:
            stmt = select(func.count(User.id))
            result = await session.execute(stmt)
            users_count = result.scalar_one()

        return await self.templates.TemplateResponse(
            request,
            "report.html",
            context={"users_count": users_count},
        )

这个例子中,我们:

  1. 定义了User模型
  2. 在视图中使用SQLAlchemy的异步会话
  3. 执行了一个计数查询
  4. 将结果传递给模板

模板开发技巧

SQLAdmin使用Jinja2模板引擎,我们可以继承基础布局来保持界面风格一致:

{% extends "sqladmin/layout.html" %}
{% block content %}
<div class="col-12">
  <div class="card">
    <div class="card-header">
      <h3 class="card-title">User reports</h3>
    </div>
    <div class="card-body border-bottom py-3">
      Users count: {{ users_count }}
    </div>
  </div>
</div>
{% endblock %}

模板开发时需要注意:

  1. 始终继承基础布局sqladmin/layout.html
  2. 使用SQLAdmin提供的CSS类保持风格统一
  3. 通过context参数传递的变量可以在模板中直接使用

高级应用场景

表单处理

自定义视图不仅可以展示数据,还可以处理表单提交:

from sqladmin import BaseView, expose
from starlette.requests import Request

class FeedbackView(BaseView):
    name = "Feedback"
    icon = "fa-solid fa-comment"

    @expose("/feedback", methods=["GET", "POST"])
    async def feedback_page(self, request: Request):
        if request.method == "POST":
            form_data = await request.form()
            # 处理表单数据
            return self.redirect("/admin/feedback?success=1")
        
        return await self.templates.TemplateResponse(
            request, "feedback.html", {"success": request.query_params.get("success")}
        )

权限控制

可以在视图方法中添加权限检查逻辑:

from sqladmin import BaseView, expose
from starlette.exceptions import HTTPException

class AdminDashboardView(BaseView):
    name = "Dashboard"
    icon = "fa-solid fa-gauge-high"

    @expose("/dashboard", methods=["GET"])
    async def dashboard_page(self, request):
        if not request.user.is_admin:
            raise HTTPException(status_code=403)
        
        return await self.templates.TemplateResponse(request, "dashboard.html")

最佳实践

  1. 代码组织:将自定义视图放在单独的模块中,避免与模型视图混在一起
  2. 模板管理:为不同类型的视图创建子目录组织模板文件
  3. 错误处理:在数据库操作中添加适当的错误处理
  4. 性能优化:对于复杂查询,考虑添加缓存机制
  5. 响应式设计:确保自定义模板在不同设备上都能良好显示

通过掌握SQLAdmin的自定义视图功能,开发者可以轻松扩展管理后台的功能,满足各种业务场景的需求,同时保持与原生界面一致的风格和用户体验。

sqladmin SQLAlchemy Admin for FastAPI and Starlette sqladmin 项目地址: https://gitcode.com/gh_mirrors/sq/sqladmin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伏崴帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值