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配置

原文地址:https://www.cnblogs.com/zmc940317/p/10163930.html

时间: 2024-08-30 15:03:35

stark组件的相关文章

python Stark 组件

Django Admin 是对model中 对应的数据表进行增删改查的组件,对每个APP下面已注册的model表进行增删改查.而stark组件仿照Admin组件开发. Admin的常用配置:  Filedstes 使用方法和效果如下图 Action 使用方法和效果图 需要在My_AppConfig(admin.ModeAdmin)中编写自定义函数 需要注意的:(1)该函数在select下拉框中 作为value值 (2)该函数有两个参数,分别是request.queryset (3)前端的复选框,

crm 使用stark组件

# Create your models here. from django.db import models class Department(models.Model): """ 部门表 市场部 1000 销售 1001 """ title = models.CharField(verbose_name='部门名称', max_length=16) code = models.IntegerField(verbose_name='部门编号',

基于Django-admin实现stark组件

一.url的分发练习 from django.conf.urls import url from django.contrib import admin from django.shortcuts import  HttpResponse def index(request):     return HttpResponse("首页")           def add(request):                         #add视图函数     return Htt

使用自己的stark组件实现crm系统

因为stark用到了templates里面的html页面文件,所以要整合在一个app里,在stark里面创建名字为templates的Python Package,将之前的html页面拷贝在stark组件里面的templates里面,然后拷贝stark组件 二.实现crm逻辑 CRM即客户关系管理,是指企业用CRM技术来管理与客户之间的关系 1.创建数据库 在app01应用下的models.py文件: from django.db import models class Department(m

crm——stark组件核心原理

关于stark组件的简要介绍: 启动后.路由加载前定制一段代码. a. 创建一个 stark  app 组件 b. 编写ready方法 1 from django.apps import AppConfig 2 3 4 class StarkConfig(AppConfig): 5 name = 'stark' 6 7 def ready(self): 8 from django.utils.module_loading import autodiscover_modules 9 # 当程序启动

stark组件配置,二层URL

1.django的admin配置 2 stark组件开发 3.2层url分发 4.小结 1.django的admin配置 model.py from django.db import models # Create your models here. class UserInfo(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() def __str__(self): return self.

Stark组件 (一)

Stark组件构建 1.启动所有app下的stark.py文件,的配置实现步骤 1.创建一个Django项目crm,并创建  app1 ,app2, stark 三个app 2.在crm 项目的settings中配置: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.

stark 组件 url 二级分发的实现

模拟 admin 组件url设计思路 项目urls 文件中: from django.contrib import admin from django.urls import path from stark.service.sites import site urlpatterns = [ path('admin/', admin.site.urls), path('stark/', site.urls), ] 1.路径设计格式:列表中放路径 1.第一级路径  :path ("stark/&qu

Django——stark组件

stark组件是仿照django的admin模块开发的一套组件,它的作用是在网页上对注册的数据表进行增删改查操作. 一.配置 1.创建stark应用,在settings.py中注册stark应用 stark APP专门用于存放自定义组件的核心代码. manage.py@stark_demo > startapp stark 在settings.py文件注册stark: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth'