Django自定义Admin后台报错提示和数据校验

简介: Django的admin后台是个好东西,接业务需求,需要开发一个单独的修改用户名的页面,没有前端支持只能考虑使用admin了。

Django的admin后台是个好东西,接业务需求,需要开发一个单独的修改用户名的页面,没有前端支持只能考虑使用admin了。

数据模型

from django.db import models

   class Order(models.Model):
    """ 订单表 """
    serial = CharField(max_length=64, verbose_name="编号", help_text="编号")

class User(models.Model):
    """ 用户表 """
    order = ForeignKey(Order, on_delete=SET_NULL, verbose_name="关联订单", help_text="关联订单", default=None, null=True)
    id_no = CharField(max_length=24, verbose_name="身份证号码", help_text="身份证号码")
    name = CharField(max_length=64, verbose_name="姓名", help_text="姓名")
    mobile = CharField(max_length=11, verbose_name="手机号", help_text="手机号", default=None, null=True, blank=True)
    phone = CharField(max_length=11, verbose_name="还是手机号", help_text="还是手机号", default=None, null=True, blank=True)
    remark = CharField(max_length=256, verbose_name="备注", help_text="备注", default=None, null=True, blank=True)

    class Meta:
        verbose_name_plural = '修改用户名操作'
  • verbose_name_plural,在admin后台展示的表名。

admin配置

基础配置

from django.contrib import admin

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    form = EditLaborForm
    list_display = ['name', 'id_no']
    search_fields = ['name', 'order__serial']
    fields = ("name", 'id_no', 'mobile', 'phone', 'remark', 'order')
    readonly_fields = ("remark")
    prepopulated_fields = {'phone': ('mobile',)}
    raw_id_fields = ("order")
    list_per_page = 10
  • @admin.register(User),注册User表。
  • list_display,控制数据列表页显示的字段。
  • search_fields,查询字段,也可以直接查询外键关联表的字段。
  • fields,数据详情页显示的字段。
  • readonly_fields,只读的字段,不能操作修改。
  • prepopulated_fields,自动填充字段,例:phone会同步显示在mobile输入框中输入的内容,:该方法不能同步中文,只能同步数字或者字母。
  • raw_id_fields,外键关联的字段输入框会从原来默认的下拉选择框变为输入框,可以点击右面的放大镜图标,查询选择已有数据。
  • list_per_page,每页展示的数据量。

进阶配置

加数据校验

from django import forms

class UserForm(forms.ModelForm):
    remark = CharField(max_length=64, required=True, label='必填的备注')

    class Meta:
        model = User
        exclude = ['id']

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    form = UserForm
    list_display = ['name', 'id_no']
    search_fields = ['name', 'order__serial']
    fields = ("name", 'id_no', 'mobile', 'phone', 'remark', 'order')
    readonly_fields = ("remark")
    prepopulated_fields = {'phone': ('mobile',)}
    raw_id_fields = ("order")
    list_per_page = 10
  • 原有的remark字段是直接根据model中的配置进行校验的,是非必填的,但是现在重新定义了form,就会使用自定义的UserForm进行校验数据。UserForm中定义了remarkrequired参数为True,所以现在remark变为了必填字段,用户不填写该字段会在点击保存时在必填的备注一栏上显示,该字段为必填项。

自定义报错内容和校验

  • 重构UserFormclean方法。

    class UserForm(forms.ModelForm):
        remark = CharField(max_length=64, required=True, label='必填的备注')
    
        class Meta:
            model = User
            exclude = ['id']
    
        def clean(self):
            """ 校验后的数据处理, 和手动处理方法 """
            cleaned_data = self.cleaned_data
            phone = cleaned_data.get('phone')
            mobile = cleaned_data.get('mobile')
            errors = {}
            if phone != mobile:
                errors.update({"phone": '填写的手机号重复', "mobile": '填写的手机号重复'})
            self.add_error(field=None, error=errors)
  • self.cleaned_data,进行校验后的数据。
  • self.add_error(),添加报错内容,参数field为报错字段,参数error为报错内容。当error字段是一个字典时field字段需要填None,然后会自动取值error参数中的key作为报错字段, value作为报错内容。报错内容会显示在对应字段的输入框上面。

重构创建的方法

  • 重构UserAdminsave_model方法。

    def save_model(self, request, obj, form, change):
       """ 创建用户 """
        if request.POST:
           return super(EditLaborAdmin, self).save_model(request, obj, form, change)

处理详情的数据

  • 重构UserAdminrender_change_form方法。

    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
        """ 重构详情里的返回数据 """
        # oss地址加上token
        if obj and obj.mobile:
            obj.mobile = f'+86{obj.mobile}'
        return super(EditLaborAdmin, self).render_change_form(request, context, add, change, form_url, obj)
相关文章
|
4月前
|
Shell 数据库 网络架构
Django+DRF 实战:从异常捕获到自定义错误信息(下)
本文详解了 Django REST Framework 中 ValidationError 的验证流程与优先级,涵盖字段内置验证、自定义验证方法、对象级验证及数据库约束,并通过实战演示如何自定义异常提示信息。
135 1
Django+DRF 实战:从异常捕获到自定义错误信息(下)
|
3月前
|
缓存 监控 中间件
Django中间件自定义开发指南:从原理到实战的深度解析
Django中间件是Web应用的“交通警察”,在请求与响应过程中进行全局处理,适用于身份验证、日志记录、性能监控等功能。本文详解中间件的工作原理、开发步骤及实战案例,帮助开发者掌握自定义中间件的构建方法,提升Django应用的可维护性与扩展性。
255 0
|
4月前
|
Python
Django+DRF 实战:自定义异常处理流程
本文详解DRF异常处理流程,包括默认处理机制与自定义异常处理器的实现方法。通过源码分析和实战示例,讲解如何全局捕获并统一返回错误信息,并结合日志记录与友好提示提升项目健壮性。适用于Django进阶开发。
193 4
|
5月前
|
中间件 数据库 Python
Django实战:自定义中间件实现全链路操作日志记录
Django中间件是一套轻量级插件系统,用于全局处理请求与响应。通过自定义中间件可实现如操作日志记录等功能,支持在请求、视图、响应及异常阶段插入逻辑。本文详解中间件生命周期、编写方式及实战案例。
125 1
|
4月前
|
数据安全/隐私保护 网络架构 UED
Django+DRF 实战:从异常捕获到自定义错误信息
本文介绍了DRF(Django REST framework)中的异常处理机制,重点讲解了内置异常类ValidationError的使用场景与示例。同时通过用户注册功能的实战演示,展示了如何在序列化器中自定义参数校验规则,并在视图中捕获并返回结构化的错误信息,提升接口的健壮性与用户体验。
106 0
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
659 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
823 4
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
安全 数据库 数据安全/隐私保护
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
383 9