stark组件
Posted zmc940317
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stark组件相关的知识,希望对你有一定的参考价值。
一 . 需求
仿照Django中的admin , 开发了自己的stark组件,实现类似数据库客户端的功能,对数据进行增删改查 .
二 . 实现思路
1 . 在settings配置里分别注册三个APP
# Application definition INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘app01.apps.App01Config‘, ‘app02.apps.App02Config‘, ‘stark.apps.StarkConfig‘, ] # (名字无所谓,叫stark纯属好记,清晰)
注 : python manage.py startapp app02 创建新项目(stark 同理)
2 . 在app01和app02的model文件中创建数据类型
from django.db import models # Create your models here. from django.contrib.auth.models import AbstractUser class UserInfo(models.Model): """ 用户信息 """ nid = models.AutoField(primary_key=True) nickname = models.CharField(verbose_name=‘昵称‘, max_length=32) telephone = models.CharField(max_length=11, null=True, unique=True) avatar = models.FileField(upload_to = ‘avatars/‘,default="/avatars/default.png") create_time = models.DateTimeField(verbose_name=‘创建时间‘, auto_now_add=True) blog = models.OneToOneField(to=‘Blog‘, to_field=‘nid‘,null=True) def __str__(self): return self.nickname class Blog(models.Model): """ 博客信息 """ nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name=‘个人博客标题‘, max_length=64) site = models.CharField(verbose_name=‘个人博客后缀‘, max_length=32, unique=True) theme = models.CharField(verbose_name=‘博客主题‘, max_length=32) # # def __str__(self): # return self.title class Category(models.Model): """ 博主个人文章分类表 """ nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name=‘分类标题‘, max_length=32) blog = models.ForeignKey(verbose_name=‘所属博客‘, to=‘Blog‘, to_field=‘nid‘) def __str__(self): return self.title class Tag(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name=‘标签名称‘, max_length=32) blog = models.ForeignKey(verbose_name=‘所属博客‘, to=‘Blog‘, to_field=‘nid‘) def __str__(self): return self.title class Article(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=50, verbose_name=‘文章标题‘) desc = models.CharField(max_length=255, verbose_name=‘文章描述‘) comment_count= models.IntegerField(default=0) up_count = models.IntegerField(default=0) down_count = models.IntegerField(default=0) create_time = models.DateTimeField(verbose_name=‘创建时间‘) homeCategory = models.ForeignKey(to=‘Category‘, to_field=‘nid‘, null=True) #siteDetaiCategory = models.ForeignKey(to=‘SiteCategory‘, to_field=‘nid‘, null=True) user = models.ForeignKey(verbose_name=‘作者‘, to=‘UserInfo‘, to_field=‘nid‘) tags = models.ManyToManyField( to="Tag", through=‘Article2Tag‘, through_fields=(‘article‘, ‘tag‘), ) def __str__(self): return self.title class ArticleDetail(models.Model): """ 文章详细表 """ nid = models.AutoField(primary_key=True) content = models.TextField() article = models.OneToOneField(to=‘Article‘, to_field=‘nid‘) class Article2Tag(models.Model): nid = models.AutoField(primary_key=True) article = models.ForeignKey(verbose_name=‘文章‘, to="Article", to_field=‘nid‘) tag = models.ForeignKey(verbose_name=‘标签‘, to="Tag", to_field=‘nid‘) class Meta: unique_together = [ (‘article‘, ‘tag‘), ] def __str__(self): v=self.article.title+"----"+self.tag.title return v app01/models.py
from django.db import models # Create your models here. class Book(models.Model): title=models.CharField(max_length=32,verbose_name="标题")
注 : python manage.py makemigrations (同步数据库)
python manage.py migrate
3 . 在每个APP中的app.py文件中添加
from django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class AppConfig(AppConfig): name = "app01" def ready(self): autodiscover_modules("stark",)
实现在Django项目启动时,扫描每个APP项目下的stark.py文件的文件, 执行其中的代码,注册每个APP下的model,为每个model生成增删改查四条URL.
流程图说明一切 (~ ̄▽ ̄)~
4 . 注册
仿照 admin 设置相关类,首先创建下面的文件
在执行 admin.py文件时我们发现其实第一步就是导入 admin,导入时通过单例模式生成一个 site 对象,现在我们也要写个类,生成一个单例对象 :
class StarkSite(object): def __init__(self): self._registry = {} site = StarkSite()
在app01 和 app02 的 stark.py 文件中导入
from stark.service.stark import site
这样我们也就得到了一个单例对象 site, 在注册时 admin使用的是site对象的 register 方法,所以我们也要写一个 register 方法 .
class StarkSite(object): def __init__(self): self._registry={} def register(self,model,modle_stark=None): if not modle_stark: modle_stark=ModelStark self._registry[model]=modle_stark(model) site = StarkSite()
这个方法的本质其实就是 往 self._registry 这个字典添加键值对,键--就是我们的数据类(如Book类),值--就是一个类的对象,这个类就是我们要创建的第二个类,样式类
class ModelStark(object): def __init__(self, model, site): self.model = model self.site = site
注意 : self.model 指的是什么? self 指的是什么?
self : 当前访问模型表的配置类对象
self.model : 当前访问模型表(如 Book 表)
通过这个类我们可以控制页面展示的内容和样式
前戏完成之后我们就可以在app01 和app02的stark.py文件中开始注册了
#app01 from stark.service.stark import site from .models import * class UserInfoConfig(ModelStark): list_display = ["nickname", "telephone"] site.register(UserInfo,UserInfoConfig) site.register(Blog) site.register(Article) site.register(Category) site.register(Tag) #app02 from stark.service.stark import site from .models import * class BookConfig(ModelStark): list_display = ["title"] site.register(Book,BookConfig)
注册完成后,我们的 site._registry字典中就有了我们注册类对应的键值对.
5 . URL配置
以上是关于stark组件的主要内容,如果未能解决你的问题,请参考以下文章