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
app01/models.py
技术分享图片
from django.db import models

# Create your models here.
class Book(models.Model):
    title=models.CharField(max_length=32,verbose_name="标题")
app02/models.py

   注 : 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组件的主要内容,如果未能解决你的问题,请参考以下文章

模拟admin组件自己开发stark组件之搜索和批量操作

stark组件4_pop功能

django 之 stark组件

Stark组件

10.20stark组件已经完工

stark组件之批量操作模仿Django的admin