10.17正式开发stark项目(二)
2018-10-17 11:09:48
orm补充参考连接: https://www.cnblogs.com/yuanchenqi/articles/8963244.html
model 进阶 参考连接: https://www.cnblogs.com/yuanchenqi/articles/7570003.html
现在的stark已经增加用不部分定制类信息:
用户可以定制表头显示,中文显示什么的
都是在stark 的ModelStark这个类里面实现了 各种url解耦,各种视图解耦,然后用户的配置类继承了这个类,
关于配置方法,如果用户没有配置则是默认用该类的默认设置,如果用户配置了,则用用户的加了一些判断
关于每个url使用了反向解析,避免了前端页面写死url的事情!
整体都是面向对象,类的使用 解耦!仿照的admin!
在代码中有注释,思路很清晰!顺着url一点一点向下找就好啦!
明天复习Django,明晚上看视频!白天该把博客整理一下啦!直接整理Django!
越努力越幸运!永远不要高估自己!!!


先补充一下知识点:
from django.test import TestCase # Create your tests here. # class A(object):
#
# x=12
#
# def xxx(self):
# print(self.x)
#
#
# class B(A):
# y=5
#
# b=B()
# b.xxx() ####################################### #
# class Person(object):
# def __init__(self,name):
# self.name=name
#
# alex=Person("alex")
#
# s="name"
#
#
# print(getattr(alex,s)) ######################################## # class Person(object):
# def __init__(self,name):
# self.name=name
#
# def eat(self):
# print(self)
# print("eat....") # 实例方法
# egon=Person("egon")
# egon.eat() # 函数
# Person.eat(123) ######################################## # class Person(object):
#
# def __init__(self,name):
# self.name=name
#
# def __str__(self):
# return self.name
#
# alex=Person("alex")
#
# print(alex.__str__())
# print(str(alex)) ######################################## def foo():
return print(foo.__name__)
app01/server.py
from stark.service.stark import site,ModelStark
from .models import *
from django.forms import ModelForm class BookModelForm(ModelForm):
class Meta:
model = Book
fields = "__all__" labels = {
"title": "书籍名称",
"price": "价格"
} class BookConfig(ModelStark):
list_display = ["title","price","publishDate"]
modelform_class=BookModelForm site.register(Book, BookConfig)
site.register(Publish)
site.register(Author)
site.register(AuthorDetail)
stark/server/stark.py
from django.conf.urls import url
from django.shortcuts import render, redirect
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.forms import ModelForm
from django.forms import widgets as wid class ModelStark(object):
# 默认的list_play[]
list_display = ["__str__", ]
list_display_links = []
modelform_class = None def __init__(self, model, site):
self.model = model
self.site = site # 配置表头: 删除 编辑,复选框
def edit(self, obj=None, header=False):
"""编辑"""
if header:
return "操作"
# return mark_safe("<a href='%s/change'>编辑</a>"%obj.pk)
_url = self.get_change_url(obj)
return mark_safe("<a href='%s'>编辑</a>" % _url) def deletes(self, obj=None, header=False):
"""删除"""
if header:
return "操作"
# return mark_safe("<a href='%s/change'>编辑</a>"%obj.pk)
_url = self.get_delete_url(obj)
return mark_safe("<a href='%s'>删除</a>" % _url) def checkbox(self, obj=None, header=False):
"""复选框"""
if header:
return mark_safe('<input id="choice" type="checkbox">')
return mark_safe('<input class="choice_item" type="checkbox">') # 获取配置类的表头信息
def get_modelform_class(self):
"""获取表的配置类"""
if not self.modelform_class:
# 如果表的配置类为空
class ModelFormDemo(ModelForm):
class Meta:
model = self.model
fields = "__all__"
labels = {
""
}
return ModelFormDemo
else:
return self.modelform_class # 添加的视图函数
def add_view(self, request):
ModelFormDemo = self.get_modelform_class()
if request.method == "POST":
form = ModelFormDemo(request.POST)
if form.is_valid():
form.save()
return redirect(self.get_list_url()) return render(request, "add_view.html", locals()) form = ModelFormDemo() return render(request, "add_view.html", locals()) # 删除的视图函数
def delete_view(self, request, id):
url = self.get_list_url()
if request.method == "POST":
self.model.objects.filter(pk=id).delete()
return redirect(url)
return render(request, "delete_view.html", locals()) # 编辑的视图函数
def change_view(self, request, id):
ModelFormDemo = self.get_modelform_class()
edit_obj = self.model.objects.filter(pk=id).first()
if request.method == "POST":
form = ModelFormDemo(request.POST, instance=edit_obj)
if form.is_valid():
form.save()
return redirect(self.get_list_url())
return render(request, "add_view.html", locals())
form = ModelFormDemo(instance=edit_obj)
return render(request, "change_view.html", locals()) # 查看的视图函数
def list_view(self, request):
print(self.model) # UserConfig(Userinfo).model
print("list_dispaly", self.list_display)
data_list = self.model.objects.all() # 【obj1,obj2,....】 # 构建表头
header_list = []
# [checkbox,"pk","name","age",edit ,deletes] 【checkbox ,"__str__", edit ,deletes】
print("header", self.new_list_play())
for field in self.new_list_play():
if callable(field):
# header_list.append(field.__name__)
val = field(self, header=True)
else:
if field == "__str__":
header_list.append(self.model._meta.model_name.upper())
else:
# header_list.append(field)
val = self.model._meta.get_field(field).verbose_name
header_list.append(val) # 构建表单数据
new_data_list = []
for obj in data_list:
temp = []
for filed in self.new_list_play(): # ["__str__",] ["pk","name","age",edit]
if callable(filed):
val = filed(self, obj)
else:
val = getattr(obj, filed)
if filed in self.list_display_links:
# "app01/userinfo/(\d+)/change"
_url = self.get_change_url(obj)
val = mark_safe("<a href='%s'>%s</a>" % (_url, val))
temp.append(val)
new_data_list.append(temp) '''
[
[1,"alex",12],
[1,"alex",12],
[1,"alex",12],
[1,"alex",12],
]
'''
print(new_data_list)
# 构建一个查看URL
add_url = self.get_add_url()
return render(request, "list_view.html", locals()) # 获取用户配置类里面的list_play[]
def new_list_play(self):
temp = []
temp.append(ModelStark.checkbox)
temp.extend(self.list_display)
if not self.list_display_links:
temp.append(ModelStark.edit)
temp.append(ModelStark.deletes)
return temp """把url进行反向解析,解耦到各自的函数中,函数中直接返回了对应的url"""
# 获取修改页面的url
def get_change_url(self, obj):
model_name = self.model._meta.model_name
app_label = self.model._meta.app_label _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk,)) return _url # 获删除改页面的url
def get_delete_url(self, obj):
model_name = self.model._meta.model_name
app_label = self.model._meta.app_label _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk,)) return _url # 获取添加页面的url
def get_add_url(self): model_name = self.model._meta.model_name
app_label = self.model._meta.app_label _url = reverse("%s_%s_add" % (app_label, model_name)) return _url # 获取查看页面的url
def get_list_url(self): model_name = self.model._meta.model_name
app_label = self.model._meta.app_label _url = reverse("%s_%s_list" % (app_label, model_name)) return _url # 二级url分发函数
def get_urls_2(self): temp = [] model_name = self.model._meta.model_name
app_label = self.model._meta.app_label temp.append(url(r"^add/", self.add_view, name="%s_%s_add" % (app_label, model_name)))
temp.append(url(r"^(\d+)/delete/", self.delete_view, name="%s_%s_delete" % (app_label, model_name)))
temp.append(url(r"^(\d+)/change/", self.change_view, name="%s_%s_change" % (app_label, model_name)))
temp.append(url(r"^$", self.list_view, name="%s_%s_list" % (app_label, model_name))) return temp @property
def urls_2(self):
print(self.model)
return self.get_urls_2(), None, None class StarkSite(object):
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) # 一级分发url函数
def get_urls(self):
temp = []
for model, stark_class_obj in self._registry.items():
model_name = model._meta.model_name
app_label = model._meta.app_label
# 分发增删改查
temp.append(url(r"^%s/%s/" % (app_label, model_name), stark_class_obj.urls_2)) '''
url(r"^app01/userinfo/",UserConfig(Userinfo).urls_2),
url(r"^app01/book/",ModelStark(Book).urls_2), '''
return temp @property
def urls(self): return self.get_urls(), None, None # 创建stark的一个单例对象
site = StarkSite()
app01/models.py
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.DateField(auto_now_add=True)
telephone=models.BigIntegerField()
addr=models.CharField( max_length=64) def __str__(self):
return self.telephone 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)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2) # 与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
10.17正式开发stark项目(二)的更多相关文章
- 10.18正式开发stark组件*(三)
2018-10-18 19:15:54 等这个stark组件做完了再上传到github上面,然后再整理博客!这就到周末啦! 因为models导入的时候出现bug,所以只有源码没有测试数据! 源码都有注 ...
- 10.16 正式开发stark组件(一)
2018-10-16 17:26:44 Django MTV 路由配置里面有 反向解析 参考连接:https://www.cnblogs.com/yuanchenqi/articles/762993 ...
- 使用Spring Boot开发Web项目(二)之添加HTTPS支持
上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...
- 利用maven开发springMVC项目(二)——框架配置
申明:主要内容来源于大神博客(使用IntelliJ IDEA开发SpringMVC网站(二)框架配置),我只是用eclipse自己练习使用,记录下来也只是为了学习使用,没有任何的商业用途,侵权必删. ...
- 17.vue移动端项目二
FilmList.vue 电影列表 <template> <div class="mz-film-list"> <!-- 正在热映 https://m ...
- 基于Mint UI和MUI开发VUE项目一之环境搭建和首页的实现
一:简介 Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要.通过它,可以快速构建出风格统一的页面,提升开发效率.真正意义上的按需加载组件.可以只加载声明过的组件及其样式 ...
- 10个Spring Boot快速开发的项目,接私活利器(快速、高效)
本文为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架.文件文档系统.秒杀系统.微服务化系统.后台管理系统等,希望能够给大家带来一点帮助:) 1.项目名称:分布式 ...
- .NET平台开源项目速览(10)FluentValidation验证组件深入使用(二)
在上一篇文章:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 中,给大家初步介绍了一下FluentValidation验证组件的使用情况.文章从构建间的验证器开 ...
- Windows 8.1 正式版微软官方原版镜像下载(新增10/17新版下载)
中文版:中国区OEM预装版本,特定国家版,锁定语言,其它功能和核心版没有区别.简体中文单语言版:锁定语言,其它功能和核心版没有区别.专业版+核心版[零售版][推荐]:镜像内包含专业版(Professi ...
随机推荐
- centos安装memcached和PHP php-pecl-memcached.x86_64
安装memcached sudo yum install memcached.x86_64 安装php-pecl-memcached php memcache有两个实现类 php-pecl-memca ...
- IOS Using UIAlertView to show alerts
UIAlertView in other words, it's a dialog box. You want to show a message or ask user to confirm an ...
- 最简单的配置Centos中JAVA的环境变量的方法
一.用途 做云开发,经常用到配置java环境变量,但是每次都写太麻烦了,所以写本文,方便以后复制粘贴. 二.安装Java 1.搜索Java包:yum search java 2.安装Java包:yum ...
- react 生命周期函数
(1)初始化阶段:getDefaultProps:获取实例的默认属性static propTypes 设置属性的类型componentWillMount:组件即将首次被装载.渲染到页面上render: ...
- toml
其目标是成为一个小规模的易于使用的语义化配置文件格式.TOML被设计为可以无二义性的转换为一个哈希表(Hash table). # 这是一个TOML文件 title = "TOML Exam ...
- Seaslog安装和参数配置
详细文档访问:https://github.com/Neeke/SeasLog/blob/master/README_zh.md 源码安装步骤: 1.先下载Seaslog源码,下载地址:http:// ...
- 转 HashMap 比较透彻的分析
HashMap 的实现原理 原文: HashMap 的实现原理 众所周知,HashMap是用来存储Key-Value键值对的一种集合,这个键值对也叫做Entry,而每个Entry都是存储在数组当中,因 ...
- Nginx 配置TCP代理
Nginx 1.9 版本以后增加了stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来体验一下首先编译安装过程configure的时候增加选项 --with-stream --wit ...
- 菜鸟教程之工具使用(六)——让Maven项目直接在eclipse内部的Tomcat中运行
Hello,大家好,好久不见!最近终于安定下来了,可以静下心来写东西了.先写篇简单的,找找感觉.工具系列的本身就比较简单,没什么技术含量.因为说到底,工具只是辅助我们工作的,知道怎么用,然后剩下的就是 ...
- 使用python抓取58手机维修信息
之前在ququ的博客上看到说 python 中的BeautifulSoup 挺好玩的,今天下午果断下载下来,看了下api,挺好用的,完了2把,不错. 晚上写了一个使用python抓取58手机维修信息的 ...