仿照admin实现一个自定义的增删改查的组件
1、首先,创建三个项目,app01,app02,stark,在settings里边记得配置。然后举例:在app01的model里边写表,用的db.sqlite3,所以数据库不用再settings里边配置。
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.DateField() telephone = models.BigIntegerField() addr = models.CharField(max_length=64) 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) title = models.CharField(max_length=32) publishDate = models.DateField() 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
2、启动:类似于admin
在stark文件夹下的apps里边写:
from django.apps import AppConfig # 经源码分析,admin就是这样先导入这个 from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig): name = 'stark' def ready(self): autodiscover_modules("stark")
这是因为,程序一启动,先执行settings.py中的install_apps里边的模块。具体步骤详看有道云笔记。
3、注册以及url的设计
首先在stark的下边创建一个service包,创建一个sites.py,
里边放全局类以及默认配置类
from django.conf.urls import url from django.shortcuts import HttpResponse, render, redirect class ModelStark(object): """ 默认配置类 """ list_display = [] def __init__(self, model): self.model = model def listview(self, request): print(self) # 当前访问模型表的配置类对象 print(self.model) # 当前访问模型表 data_list = self.model.objects.all() print(self.list_display) return render(request, "list_view.html", {"data_list": data_list}) def addview(self, request): return HttpResponse("addview") def changeview(self, request, id): return HttpResponse("changeview") def delview(self, request, id): return HttpResponse("delview") def get_urls(self): temp = [ url(r"^$", self.listview), url(r"add/$", self.addview), url(r"(\d+)/change/$", self.changeview), url(r"(\d+)/delete/$", self.delview), ] return temp @property def urls(self): return self.get_urls(), None, None class AdminSite(object): """ stark组件的全局类 """ def __init__(self): self._registry = {} def register(self, model, admin_class=None): # 设置配置类 if not admin_class: admin_class = ModelStark self._registry[model] = admin_class(model) def get_urls(self): temp = [] for model, config_obj in self._registry.items(): model_name = model._meta.model_name app_label = model._meta.app_label temp.append(url(r"%s/%s/" % (app_label, model_name), config_obj.urls)) # config_obj 获取的就是每个for循环中的BookConfig(Book),publish,author遍历的对象 ''' temp=[ #(1) url(r"app01/book/",BookConfig(Book).urls) #(2) url(r"app01/book/",(BookConfig(Book).get_urls(), None, None)) #(3) url(r"app01/book/",([ url(r"^$", BookConfig(Book).listview), url(r"add/$", BookConfig(Book).addview), url(r"(\d+)/change/$", BookConfig(Book).changeview), url(r"(\d+)/delete/$", BookConfig(Book).delview), ], None, None)) ########### # url(r"app01/publish/",([ url(r"^$", ModelStark(Publish).listview), url(r"add/$", ModelStark(Publish).addview), url(r"(\d+)/change/$", ModelStark(Publish).changeview), url(r"(\d+)/delete/$", ModelStark(Publish).delview), ], None, None)) ] ''' return temp @property def urls(self): return self.get_urls(), None, None site = AdminSite()