• 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.name class Book(models.Model):
title=models.CharField(max_length=32) def __str__(self):
return self.title

admin.py配置

from django.contrib import admin

# Register your models here.
from .models import * class UserAdmin(admin.ModelAdmin):
list_display = ["pk",'name','age']
list_filter = ['name','age'] # 定制action具体方法
def func(self,request,queryset):
queryset.update(age=44) func.short_description = "批量初始化操作"
actions = [func] admin.site.register(UserInfo,UserAdmin)
admin.site.register(Book) admin.py
makemigrations
migrate
createsuperuser (alex 1234qwer)

2 stark组件开发

1、 python manage.py startapp stark

2、stark/service/stark.py (单例对象)

# -*- coding: utf-8 -*-
# @Time : 2018/08/17 0017 14:46
# @Author : Venicid class ModelStark(object):
def __init__(self,model, site):
self.model = model
self.site = site class StarkSite(object):
"""site单例类"""
def __init__(self):
self._registry = {} def register(self,model, stark_class=None):
"""注册"""
if not stark_class:
stark_class = ModelStark self._registry[model] = stark_class(model,self) site = StarkSite() # 单例对象

3. settings中配置'  stark.apps.StarkConfig'

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig):
name = 'stark' def ready(self):
autodiscover_modules('stark')

4.models.py (一对一,一对多,多对多)

app01这个app下创建models表

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.CharField(max_length=64,default="无")
telephone=models.BigIntegerField()
addr=models.CharField( max_length=64) def __str__(self):
return self.addr 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,verbose_name="书籍号")
title = models.CharField( max_length=32,verbose_name="书籍名")
publishDate=models.DateField(verbose_name="出版日期")
price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格") # 与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

5、stark中注册

在app01下创建一个stark的名字的Py文件,将创建的模型表注册进去。

6 配置urls,启动

3、2层url分发

1、构造1层url

stark/service/stark.py

# -*- coding: utf-8 -*-
# @Time : 2018/08/17 0017 14:46
# @Author : Venicid
from django.conf.urls import url class ModelStark(object):
def __init__(self,model, site):
self.model = model
self.site = site class StarkSite(object):
"""site单例类"""
def __init__(self):
self._registry = {} def register(self,model, stark_class=None):
"""注册"""
if not stark_class:
stark_class = ModelStark self._registry[model] = stark_class(model,self) def get_urls(self):
"""构造一层urls app01/book"""
temp = []
print(self._registry) for model, stark_class_obj in self._registry.items():
app_label = model._meta.app_label # app01
model_name = model._meta.model_name # book
temp.append(url(r'^%s/%s'%(app_label, model_name),([],None,None))) return temp @property
def urls(self): # return [],None,None
return self.get_urls(),None,None site = StarkSite() # 单例对象

可以通过stak下循环取到不同的app名字和模型表拼接一个个的url.

2、不同的model表,显示不同的url

3、ModelStark

ModelStark()
self.model:用户访问的模型表

4、构造2层urls

  

from django.conf.urls import url
from django.shortcuts import HttpResponse class ModelStark(object):
def __init__(self,model, site):
self.model = model
self.site = site def list_view(self, request):
     #查看视图
print(self.model) # <class 'app01.models.Book'> 用户访问的模型表
return HttpResponse('list_view') def add(self, request):
     #增加视图
return HttpResponse('add') def delete(self, request, id):
     #删除视图
return HttpResponse('delete') def change(self, request, id):
     #修改视图
return HttpResponse('change') def get_urls2(self):
"""构造 add/delete/change"""
temp = []
temp.append(url(r'^$', self.list_view))
temp.append(url(r'^add/', self.add))
temp.append(url(r'^(\d+)/delete/', self.delete))
temp.append(url(r'^(\d+)/change/', self.change))
return temp #还是返回一个列表 @property
def urls2(self):
return self.get_urls2(), None, None #返回[],None,None,这种指定的格式。 class StarkSite(object):
"""site单例类"""
def __init__(self):
self._registry = {} def register(self,model, stark_class=None):
"""注册"""
if not stark_class:
stark_class = ModelStark
self._registry[model] = stark_class(model,self)
     #在这里注意以模型表为键,<class 'app01.models.Author'>: <app01.stark.AuthorConfig object at 0x00000154D50F4240>
     #模型表的配置为值,如果没有配置默认使用ModelStark.
def get_urls(self):
"""构造一层urls app01/book"""
temp = []
for model, stark_class_obj in self._registry.items():
print(model, 'stark_clas_obj', stark_class_obj) # 不同的model模型表
"""
<class 'app01.models.UserInfo'> ----> <app01.starkadmin.UserConfig object at 0x00000072DDB65198>
<class 'app01.models.Book'> ----> <stark.service.stark.ModelStark object at 0x00000072DDB65240>
""" app_label = model._meta.app_label # app01
model_name = model._meta.model_name # book
# temp.append(url(r'^%s/%s'%(app_label, model_name),([],None,None)))
temp.append(url(r'^%s/%s'%(app_label, model_name),stark_class_obj.urls2)) #这里循环一条,调用配置类里面的url2,拼接上增删改查。
"""
path('app01/userinfo/',UserConfig(Userinfo,site).urls2),
path('app01/book/',ModelStark(Book,site).urls2),
"""
return temp @property
def urls(self):
# return [],None,None
return self.get_urls(),None,None site = StarkSite() # 单例对象

这里注意为什么要用stark_class_obj,因为这个是ModelStark的实例,传入的model是什么,那么self.model就是什么,因为以model为键,这个stark_class_obj为值,参数传入的

是model,所以就能识别出来哪个表的增删改查。

_registry  {<class 'app01.models.Author'>: <app01.stark.AuthorConfig object at 0x00000154D50F4240>}
 

4、小结

  1. url分发:

url(r'^stark/', ([],None,None))

url(r'^stark/', stark.site.urls)

@property
def urls(self):
  return self.get_urls(), None, None

  2. 用户可以自定制配置页面,所以调用配置类 stark_class_obj.urls2

# 分发增删改查
temp.append(url(r'%s/%s/'%(app_label,model_name), stark_class_obj.urls2))

  

  3.ModelStark

ModelStark()
self.model:用户访问的模型表

  

model_name = self.model._meta.model_name
app_label = self.model._meta.app_label

  

 

stark组件配置,二层URL的更多相关文章

  1. stark组件开发之URL别名的设置

    from django.urls import re_path from stark.servers.start_v1 import site, StartHandler from django.ht ...

  2. stark组件开发之URL分发和默认Handler

    为register 函数添加一个,prev参数,默认None ,用于可以让用户自己指定前缀. def register(self, model_class, handler_class=None, p ...

  3. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...

  4. 7 stark组件介绍、配置、2层url

    1.django的admin配置 model.py from django.db import models # Create your models here. class UserInfo(mod ...

  5. stark 组件 url 二级分发的实现

    模拟 admin 组件url设计思路 项目urls 文件中: from django.contrib import admin from django.urls import path from st ...

  6. stark组件(1):动态生成URL

    项目启动时自动生成URL 效果图: 知识点: Django启动前通过apps下的ready方法执行一个可以生成URL的py文件 include函数主要返回有三个元素的一个元组.第一个是url配置(ur ...

  7. stark组件(2):提取公共视图函数、URL分发和设置别名

    效果图: Handler类里处理的增删改查.路由分发.给URL设置别名等包括以后还要添加的很多功能,每一个数据库的类都需要,所以我们要把Handler提取成一个基类.提取成基类后,每一个数据表都可以继 ...

  8. 【django之stark组件】

    一.需求 仿照django的admin,开发自己的stark组件.实现类似数据库客户端的功能,对数据进行增删改查. 二.实现 1.在settings配置中分别注册这三个app # Applicatio ...

  9. django 之 stark组件

    ----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...

随机推荐

  1. 洛谷模拟NOIP考试反思

    洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...

  2. 【PS技巧】如何拼图

    1.材料准备 根据对图片的内容表达,粗略的“计划”,每张图片摆放位置及尺寸.C与D等高,C/D与B叠高后与A等高.C与D叠宽后与B等宽. 2.记录每张图片原始大小 (1)双击工作区,打开待拼接图片 ( ...

  3. C#基于wpf编写的串口调试助手

    支持数据保存,自定义协议解码等功能 链接:https://pan.baidu.com/s/1zvhcES4QIjpDDJGzth1qOA 提取码:lp2x

  4. Idea自带工具解决冲突

    1:产生冲突 2:解决冲突 解决冲突具体操作: 手动合并代码: 此时点击的是local的>:点击changes的X则合并效果为: 也可以两侧都点击>.结果为: 也可以都点击X,结果为: 最 ...

  5. 【转】Windows中设置Fiddler抓HTTPS请求的解决办法 Unable to configure Windows to Trust the Fiddler Root certificate .

    官网设置 Click Tools > Fiddler Options > HTTPS. Click the Decrypt HTTPS Traffic box. 按照上述要求,我的设置是这 ...

  6. 第一章 mysql的体系结构与存储引擎

    数据库从逻辑上可以分为两部分,一部分负责存储即文件系统,这部分有个更时髦的名字叫存储引擎,存储引擎负责如何把数据以及索引相关的内容以合适的形式组织并存储到磁盘上.另一部分为server部分,负责和用户 ...

  7. 【css】IE盒子模型和标准W3C盒子模型

    其实盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型. 1.标准盒子 从上图可以看到标准 W3C 盒子模型的范围包括 margin.border.padding.content,并且 c ...

  8. Uncaught ReferenceError: layer is not defined

    错误详细信息,如下: Uncaught ReferenceError: layer is not defined' 关键词就是not defined 未定义,那么解决方案就是给它定义. 原来的问题代码 ...

  9. AI R-CNN目标检测算法

    Region-CNN,简称R-CNN,是首次将深度学习应用于目标检测的算法. bounding box IOU 非极大值抑制 selective search 参考链接: https://blog.c ...

  10. [MicroPython]TPYBoard开发板DIY小型家庭气象站

    对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度. BMP180是一直常 ...