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)
相关文章
|
6月前
|
Linux 数据库管理 Python
CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)
CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)
818 4
|
4月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
172 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
215 4
|
3月前
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
3月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
3月前
|
关系型数据库 MySQL 数据库连接
9-13|django.db.utils.OperationalError: (2006, 'Server has gone away') 报错
9-13|django.db.utils.OperationalError: (2006, 'Server has gone away') 报错
|
4月前
|
安全 数据库 数据安全/隐私保护
|
4月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
121 9
|
4月前
|
前端开发 关系型数据库 MySQL
Python基于Django框架图书管理系统,Bootstrap框架UI,后台EasyUI框架UI,有登录,实现增删改查的富文本效果
本文介绍了一个使用Python Django框架开发的图书管理系统,该系统采用Bootstrap框架进行前端UI设计,EasyUI框架用于后台UI界面,集成了富文本编辑器,并实现了登录及增删改查功能。
|
4月前
|
数据采集 数据可视化 数据挖掘
基于Django的数据分析可视化系统,有后台,有增删改查,实现多用户登录
本文介绍了一个基于Django框架开发的今日头条数据分析可视化系统,该系统具备后台管理、增删改查功能以及多用户登录,利用数据可视化技术为新闻媒体行业提供数据管理和决策支持。
基于Django的数据分析可视化系统,有后台,有增删改查,实现多用户登录