• 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.messages',
        'django.contrib.staticfiles',
        'app1.apps.App1Config',
        'app2.apps.App2Config',
        'stark.apps.StarkConfig',
    ]

    3.在app1 和app2 下分别新建一个stark.py 的文件

    4.在stark     app.py 文件中 :

    from django.apps import AppConfig
    
    from django.utils.module_loading import autodiscover_modules
    
    class StarkConfig(AppConfig):
        name = 'stark'
    
        def ready(self):
            autodiscover_modules('stark')
    stark的app.py文件中

    以上步骤完成后,crm项目一启动,就可以执行所有(app1和app2)下的stark.py 文件:

    测试,在app1 的stark.py 文件中写入测试代码:print("app1...."),在app2的stark.py 文件中写入测试代码:print("app2...")

    测试结果:

    2.注册模型类

    1.在stark app 中创建一个service包

     2.然后在service文件夹 中创建sites.py 文件(stark组件源码的位置),该文件下有模型类 ,基础类

    3.在app1 和app2 的model.py 文件中:

    from django.db import models
    
    # Create your models here.
    from django.db import models
    
    # Create your models here.
    class Book(models.Model):
        title = models.CharField( max_length=32,verbose_name="书籍名称")
        pub_date=models.DateField(verbose_name="出版日期")
        price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格")
        publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE,null=True)
        authors=models.ManyToManyField("Author",db_table="book2authors") # 创建关系表
        def __str__(self):
            return self.title
    
    class Publish(models.Model):
        name=models.CharField( max_length=32,verbose_name="名字")
        city=models.CharField( max_length=32)
        email=models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name=models.CharField( max_length=32)
        age=models.IntegerField()
        #books=models.ManyToManyField("Book")
        ad=models.OneToOneField("AuthorDetail",null=True,on_delete=models.CASCADE)
        def __str__(self):
            return self.name
    class AuthorDetail(models.Model):
        birthday=models.DateField()
        telephone=models.BigIntegerField()
        addr=models.CharField( max_length=64)
        # author=models.OneToOneField("Author",on_delete=models.CASCADE)
        def __str__(self):
            return str(self.telephone)
    app1 model.py 文件中内容
    from django.db import models
    
    # Create your models here.
    
    class Article(models.Model):
        title=models.CharField(max_length=32)
        def __str__(self):
            return self.title
    app2 model.py 文件中

    在项目下进行数据迁移,执行:

    python manage.py  makemigrations

    prython manage.py migrate

    4.到某一个app (以app1为例)下的stark.py文件中注册:

    from stark.service.sites import site ,ModelStark#导入实例化好的单例对象
    
    from . import models
    
    
    class Bookconfig(ModelStark):
        pass
    
    
    site.register(models.Book,Bookconfig)
    
    site.register(models.Publish)
    
    print(site._registry)
    app1 下stark.py 中

     以上基本实现了stark组件的注册效果。

    3.二级分发

    class ModelStark():
        def __init__(self,model):
            self.model=model
    
        def list_view(self,request):
    
            return HttpResponse("list_view")
    
        def add_view(self, request):
            return HttpResponse("add_view")
    
        def change_view(self, request):
            return HttpResponse("change_view")
    
        def delete_view(self, request):
            return HttpResponse("delete_view")
    
    
        @property
        def urls(self):
    
            tmp= [
                path("",self.list_view),
                path("add/",self.add_view),
                path("(d+)/change/",self.change_view),
                path("(d+)/delete/",self.delete_view),
            ]
    
            return tmp,None,None
    
    
    
    class StarkSite():
    
        def __init__(self):
            self._rigistry={}
    
        def register(self,model,stark_class=None):
    
            stark_class = stark_class or ModelStark
    
            self._rigistry[model] = stark_class(model)
    
    
        @property
        def urls(self):
            tmp = []
            for model,config_obj in self._rigistry.items():
                app1_name = model._meta.app_label
                model_name = model._meta.model_name
                tmp.append(
                    path("%s/%s/"%(app1_name,model_name),config_obj.urls)
                )
    
            return tmp,None,None
    
    
    site = StarkSite()

    1.静态文件和模板引入问题

      1.django 中每个app 下可以创建自己的templates包,django先会去全局的templates,在去每一个app 下的templates下找模板文件(按app 注册顺序找)

      2.所以为了避免全局的模板文件和app先的模板文件重名,在stark app templates 文件夹下再建一个stark文件夹 用来存放模板文件。

      3. app下(此处指stark  app )创建静态文件夹static , 并且app 创建的静态文件夹,不需要进行相关的配置,就可以直接用。因为django 会默认去每个app 下找静态文件。

      4.静态文件的引入:

     2.  新语法

    from app1.models import Book
    
    obj = Book._meta.get_field("title")
    
       # obj 为 一个field 对象       打印结果: <django.db.models.fields.CharField: title>
    
    print(obj.verbose_name)   
    #  默认打印为“title” ,如果模型类中设置为该字段设置了,verbose_name="书籍名称”
    #则会打印书籍名称
  • 相关阅读:
    2007年12月英语四级预测作文大全1
    2007年12月英语四级预测作文大全3
    2007年12月英语四级预测作文大全2
    2007年12月英语四级预测作文大全3
    2007年12月英语四级预测作文大全2
    2007年12月英语四级预测作文大全3
    2007年12月英语四级预测作文大全2
    2007年12月英语四级预测作文大全3
    2007年12月英语四级预测作文大全2
    2007年12月英语四级预测作文大全2
  • 原文地址:https://www.cnblogs.com/knighterrant/p/10272253.html
Copyright © 2020-2023  润新知