stark组件配置,二层URL

时间:2021-08-31 14:28:27
  • 1、django的admin配置
  • 2 stark组件开发
  • 3、2层url分发
  • 4、小结

1、django的admin配置

stark组件配置,二层URL

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)

stark组件配置,二层URL

2 stark组件开发

1、 python manage.py startapp stark

stark组件配置,二层URL

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

stark组件配置,二层URL

# -*- 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'

stark组件配置,二层URL

stark组件配置,二层URL

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文件,将创建的模型表注册进去。

stark组件配置,二层URL

stark组件配置,二层URL

6 配置urls,启动

stark组件配置,二层URL

3、2层url分发

1、构造1层url

stark组件配置,二层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() # 单例对象

stark组件配置,二层URL

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

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

stark组件配置,二层URL

3、ModelStark

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

stark组件配置,二层URL

4、构造2层urls

stark组件配置,二层URL  stark组件配置,二层URL

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

 

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&lpar;内容回顾&comma;单例模式&comma;路由系统&comma;stark组件&rpar;

    一.内容回顾 类可否作为字典的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. Struts2配置Result&lpar;Struts2&lowbar;result&rpar;

    一.概要 二.常用四种类型的配置 Struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!D ...

  2. 第二十一章 数据访问&lpar;In &period;net4&period;5&rpar; 之 序列化

    1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以 ...

  3. C&plus;&plus;学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  4. 每天一个Linux命令 5

    命令名称:touch 功能描叙:创建空文件 格式:touch  文件名 范例:$touch japan.list(当前路径创建) $touch  /root/japan.list(指定路径创建) $t ...

  5. linux最大进程数、最大打开文件数

    ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制.本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响 ...

  6. 学习笔记之Microsoft Azure

    Microsoft Azure - Wikipedia https://en.wikipedia.org/wiki/Microsoft_Azure Microsoft Azure (formerly  ...

  7. Spring-profile设置

    开发环境和生产环境通常采用不同的数据库连接方式,开发环境可以采用侵入式,而生产环境中采用jndi连接池,所以要根据不同环境配置不同的bean,Spring中提供了profile来实现动态生成相应的be ...

  8. 使用泛型和内部静态类实现栈(FILO,先进后出)

    package tuple; /** * 泛型实现的栈,FILO * @author Youjie * * @param <T> */ public class LinkedStack&l ...

  9. 20155229 实验一《Java开发环境的熟悉》实验报告

    20155229 实验一<Java开发环境的熟悉>实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Idea 编辑.编译.运行.调试Java程序. 实验步骤 (一) ...

  10. 【Wannafly挑战赛9-A】找一找

    链接:https://www.nowcoder.net/acm/contest/71/A 题目描述 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 输入描 ...