一、准备:
1、组件部分(数据增删改查实现):模仿django admin开发一个组件
效果:
(1)、启动服务(先在settings中添加app)
from django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class XadminConfig(AppConfig): name = 'xadmin' def ready(self): autodiscover_modules('xadmin')
(2)、注册表
from django.db import models # Create your models here. class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) age=models.IntegerField() # 与AuthorDetail建立一对一的关系 authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) def __str__(self): return self.name class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday=models.DateTimeField() telephone=models.BigIntegerField() addr=models.CharField( max_length=64) def __str__(self): return self.addr class Publish(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) city=models.CharField( max_length=32) email=models.EmailField() def __str__(self): return self.name class Book(models.Model): nid = models.AutoField(primary_key=True, verbose_name=" 编号") title = models.CharField( max_length=32, verbose_name="书籍名称") publishDate=models.DateTimeField(null=True, verbose_name='日期') price=models.DecimalField(max_digits=5, decimal_places=2) # 与Publish建立一对多的关系,外键字段建立在多的一方 publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表 authors=models.ManyToManyField(to='Author',) def __str__(self): return self.title
from xadmin.service.start__xadim import site, ModelAdmin from app01 import models from django import forms from django.utils.safestring import mark_safe from django.urls import reverse class BookConfig(ModelAdmin): # def add_tag_change(self, obj=None, is_header=False): # if is_header: # 如果是表头 # return '修改操作' # return mark_safe('<a href="%s">修改</a>' % reverse('change_data', args=(obj.pk,))) # 如果是表单数据 # # def add_tag_delete(self, obj=None, is_header=False): # if is_header: # return '删除操作' # return mark_safe('<a href="%s/delete">删除</a>' % reverse('delete_data', args=(obj.pk,))) # # def add_tag_checked(self, obj=None, is_header=False): # if is_header: # return mark_safe('<input type="checkbox" name="checked_data" class="all">') # return mark_safe('<input type="checkbox" name="checked_data" value="%s" class="list_all">' % obj.pk) class ModelForms(forms.ModelForm): class Meta: model = models.Book fields = '__all__' widgets = {'publishDate': forms.widgets.TextInput(attrs={'type': 'date', }), } labels = { 'title': '书名', 'price': '价格', } # def action_test(self, queryset, request): # print(self,type(self)) # for i in queryset: # i.price = 100 # i.save() # action_test.short_description = "批量初始化" # action函数功能实现简介 list_display = ['nid', 'title', 'price', 'publish', 'publishDate', 'authors'] list_display_links = ['title'] model_forms_chinese_field = ModelForms list_search_fields = ['title', 'price'] # list_action_func = [action_test] list_filter = ['title', 'publish', 'authors'] class PublishConfig(ModelAdmin): list_display = ['nid', 'title', 'price'] site.register(models.Book, BookConfig) site.register(models.Publish) site.register(models.Author) site.register(models.AuthorDetail)
(3)、服务(url分发,数据增删改查,展示等等)
注意问题:
url二级分发为什么在配置类实现?
url地址反向解析
自定义显示哪些字段内容,多对多字段该如何处理,修改和删除标签、哪个字段可点击进入到修改页面,该如何实现
自定义哪些字段可以搜索,获取搜索值后用Q方法处理条件
自定义批量处理函数,页面标签value值应该放什么(函数名,选中数据的pk值)
自定义哪些字段可以筛选(关系字段如何获取,普通字段如何获取)
field_obj = self.model_admin_self.model._meta.get_field(filter_field) if isinstance(field_obj, ManyToManyField) or isinstance(field_obj, ForeignKey): # 过滤标签是不是多对多或者多对一关系 queryset_list = field_obj.remote_field.model.objects.all() # 是的话取到所有关联表对象
修改页面时,关系字段应该可以直接点击添加按钮添加关系字段对象
主页面展示的数据应该放在一个类下,比如分页数据、表头数据、表单数据、函数数据、过滤字段数据等。只需要在视图函数中创建这个类对象,把所有数据对象、request、当前models的配置类self对象作为参数传入,把创建的这个类对象传入模板语言,模板语言直接通过这个对象可以调用类下的所有方法,用于展示分页、表头、表单等数据。
修改和增加页面使用modelform模块快速构建一个html页面
url路径保存搜索条件:先深copy之前的url条件,然后再往条件添加新的条件,添加后换成url编码,最后把它拼到a标签
params = copy.deepcopy(request.GET) # {‘publish’:‘1’} params[id] = 1 #{‘publish’:‘1’, ‘id’:‘1’} url = params.urlencode() #publish=1&id=1 link_tag = mark_safe("<a href='?%s' class='filter_field'>%s</a>" % (url, text))
(4)、url
from django.contrib import admin from xadmin.service.start__xadim import site from django.urls import path, re_path urlpatterns = [ path('admin/', admin.site.urls), path('xadmin/', site.urls),]
2、权限管理部分:RBAC权限介绍,用django制作一个简单的权限组件
二、导入组件:
三、功能扩展: