+关注继续查看

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 中定义了 remark required 参数为 True ,所以现在 remark 变为了必填字段,用户不填写该字段会在点击保存时在 必填的备注 一栏上显示,该字段为必填项。

自定义报错内容和校验

  • 重构 UserForm clean 方法。

    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作为报错内容。报错内容会显示在对应字段的输入框上面。

重构创建的方法

  • 重构 UserAdmin save_model 方法。

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

处理详情的数据

  • 重构 UserAdmin render_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)
在admin.py文件中声明:❤️ manage的startapp命令在创建post应用的时候会自动创建admin.py文件,想要把自定义的Model注册到管理后台,就需要在这个文件中进行声明: 用户反馈管理功能,是对前端用户反馈的问题进行展示,并可实现删除功能。是一个很实用的功能,也算是当代网站的标配。它可以实时的跟踪到用户对网站的各种意见和吐槽,开发者能及时修缮网站功能或者修改网站bug。 本讲我们会讲到一些关于发邮件的技术。我们知道,订阅功能是一个很常见的功能,当用户订阅某个网站后,网站会通过后台给用户发送网站最新的一些动向,一般是通过邮件来发送的。当你阅读完本节内容,会对发邮件的流程有一个大概的了解。 照例我们先添加评论管理的相关路由 path('comment_list/', views.CommentListView.as_view(), name='comment_list'), path('comment_delete/', views.comment_delete, name='comment_delete'), 首先是评论列表的展示,我们通过CommentListView视图类来实现,该类依然是继承ListView来实现的。 从本讲开始,我们开始视频管理功能的开发,视频管理包括视频上传、视频列表、视频编辑、视频删除。另外还有视频分类的功能,会一同讲解。这一讲非常重要,因为你将学习到一些之前没有学过的技术,比如大文件上传技术。 从本讲起,我们会介绍后台管理系统的开发,后台管理,主要是对数据库中的数据进行增、删、改、查的操作,满足网站管理员对网站的管理与维护的需求。 其实,django自带的也有一个后台管理系统(/admin),但是自带的后台非常简陋,无论是界面,还是功能上,都无法满足用户的需求,因此,我们自己开发了一套后台管理系统。