2018-10-16 17:26:44

Django MTV  路由配置里面有 反向解析

参考连接:https://www.cnblogs.com/yuanchenqi/articles/7629939.html

    https://www.cnblogs.com/yuanchenqi/articles/7629939.html#_label2

这个就是仿照Django的admin做的! 这是1.0版本,后面还得迭代!

明天开始整理自己博客!这几天一直在看视频!

我觉得温故而习之,可以为师矣!!明天回顾一下整理博客还是很有必要的!

放上stark1.0代码 后期继续优化,等有完整版的放到github里面

strak是创建的新的app,需要在settings里面注册一下

stark/service/stark.py

from django.conf.urls import url
from django.shortcuts import HttpResponse, render
# 超级用户 root root1234 class ModelStark(object):
"""父类默认配置类"""
# 默认为空
list_display = [] def __init__(self, model, site):
self.model = model
self.site = site def add(self, request):
return HttpResponse("add") def delete(self, request, id):
return HttpResponse("delete") def change(self, request, id):
return HttpResponse("change") def list_view(self, request):
data_list = self.model.objects.all() # 【obj1,obj2,....】
new_data_list = []
for obj in data_list:
temp = []
for filed in self.list_display: # ["pk","name","age",edit]
if callable(filed): # 判断循环字段是字符串还是函数
val = filed(self, obj)
else:
val = getattr(obj, filed)
temp.append(val)
new_data_list.append(temp) '''
[
[1,"alex",12], ] '''
return render(request, "list_view.html", locals()) def get_urls_2(self):
"""实现二级分发"""
temp = []
# 通过方法 找到表的名字和 app的名字
model_name = self.model._meta.model_name
app_label = self.model._meta.app_label
# 反向解析,给url起名字,
temp.append(url(r"^add/", self.add, name="%s_%s_add" % (app_label, model_name)))
temp.append(url(r"^(\d+)/delete/", self.delete, name="%s_%s_delete" % (app_label, model_name)))
temp.append(url(r"^(\d+)/change/", self.change, 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):
# 二级分发 和一级分发一样
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) 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
# 分发增删改查
# stark_class_obj是传入配置类的实例对象,由于该类继承了ModelStark,则解耦直接调用父类方法
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):
# 返回一个([], None, None)
return self.get_urls(), None, None # 创建单例对象
site = StarkSite()

app01/stark.py

from stark.service.stark import site, ModelStark
from django.urls import reverse # 反向解析导入的包
from .models import *
from django.utils.safestring import mark_safe # 防止转译 class UserConfig(ModelStark):
"""UserInfo的表的配置类"""
def edit(self, obj):
# return mark_safe("<a href='%s/change'>编辑</a>"%obj.pk)
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,))
print("_url", _url)
return mark_safe("<a href='%s'>编辑</a>"%_url) def deletes(self, obj):
# return mark_safe("<a href='%s/change'>编辑</a>"%obj.pk)
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,))
print("_url", _url)
return mark_safe("<a href='%s'>删除</a>" % _url) def checkbox(self, obj):
return mark_safe('<input type="checkbox">')
list_display = [checkbox, "pk", "name", "age", edit, deletes] site.register(UserInfo, UserConfig) class BookConfig(ModelStark):
list_display = ["pk", "title"] site.register(Book)

urls.py

from django.conf.urls import url
from django.contrib import admin
from stark.service.stark import site urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^stark/', site.urls),
]

app01/models.py

from django.db import models

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

里面有注释,按照流程一步一步走,还是很清楚!

Django的admin做的最好的就是通过类来解耦,降低耦合性!!!!这篇是昨天的迭代,增加部分views东西!有不懂的可以看昨天的博客!

放上笔记!

上节回顾

1   admin的使用
list_display
list_display_links
search_fields
list_filter
action class BookConfig(admin.ModelAdmin):
list_display
list_display_links
search_fields
list_filter
action
admin.site.register(Book,BookConfig) 2 知识点 url()的使用 情况1:url(r'^book/', views.book), # book(request) 情况2 分发:
url(r"^yuan/", ([
url(r'^test01/', ([
url(r'^test04/', test04),
url(r'^test05/', test05),
], None, None)),
url(r'^test02/', test02),
url(r'^test03/', test03),
], None, None)
) 单例模式
生成单例模式的方式:
(1)使用 __new__
(2)使用模块
class A()
pass
a=A() admin源码:
1 启动文件
class StarkConfig(AppConfig):
name = 'stark'
def ready(self):
autodiscover_modules('stark') 2 注册 admin.py admin.site.register(Book,BookConfig) 源码: class AdminSite():
def __init__(self, name='admin'):
self._registry = {} def register(self,model,admin_class):
if not admin_class:
admin_class = ModelAdmin self._registry[model] = admin_class(model, self) site=AdminSite() 3 设计url 如何通过model类变量获取该模型的字符串名称和该模型所在app的字符串名称:
print("===>", model._meta.model_name)
print("===>", model._meta.app_label) 在ModelStark中:
self.model: 用户当前访问的模型表 查看页面:
表头
表数据
search
action
分页
filter 增删改(modelForm) pop 作业1: 访问任何模型时都有编辑,删除,选择
作业2:
如果用户没有配置list_display,显示对象
作业3:
名称空间

              

10.16 正式开发stark组件(一)的更多相关文章

  1. 10.18正式开发stark组件*(三)

    2018-10-18 19:15:54 等这个stark组件做完了再上传到github上面,然后再整理博客!这就到周末啦! 因为models导入的时候出现bug,所以只有源码没有测试数据! 源码都有注 ...

  2. 10.17正式开发stark项目(二)

    2018-10-17 11:09:48 orm补充参考连接: https://www.cnblogs.com/yuanchenqi/articles/8963244.html model 进阶 参考连 ...

  3. 10.15仿admin开发stark组件(一)

    2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...

  4. 模拟admin组件自己开发stark组件之自定义list_display,反向解析url

    反向解析 在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请 ...

  5. 模拟admin组件自己开发stark组件之创建篇

    admin组件 admin组件为我们提供了针对django管理页面 我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程 启动注册 1. 扫描所有应用下的注册了应用中的ad ...

  6. 模拟admin组件自己开发stark组件之搜索和批量操作

    搜索相关,搜索的本质就是从数据库查询出来的数据过滤 用户自定义给出过滤条件joker.py list_display = ('id','title','price',) show_add_btn = ...

  7. 模拟admin组件自己开发stark组件之增删改查

    增删改查,针对视图 我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写 app01下的joker.py文件 class BookModelFo ...

  8. django 之 stark组件

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

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

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

随机推荐

  1. CustomJsonDateDeserializer @JsonDeserialize(using = CustomJsonDateDeserializer.class) Jackson 反序列化Date时遇到的问题 java中json日期属性反序列化

    public class CustomJsonDateDeserializer extends JsonDeserializer<Date> { @Override public Date ...

  2. 【H5动画】谈谈canvas动画的闪烁问题

    一般来说,在H5开发中,使用canvas往往只是为了展示一些简单的图表或者简单短小的动画,很少考虑到有闪烁的问题. 最近,在手机QQ魔法表情的项目中,就遇到了奇葩的闪烁问题. 这里说的闪烁,是指动画刚 ...

  3. 快捷切换hosts的小工具:SwitchHosts!

    Windows 绿色版本下载:http://oldj.github.io/SwitchHosts/. 日常开发工作中,我们可能经常需要切换各种 hosts 绑定,比如在本地开发时可能需要一个开发环境的 ...

  4. Linux 内存机制【转载】

    原文地址:http://blog.csdn.net/tianlesoftware/article/details/5463790 一. 内存使用说明 Free 命令相对于top 提供了更简洁的查看系统 ...

  5. Django Web开发学习笔记(1)

    一.Python的标准类型 (1)bool型 >>> bool("") False >>> bool(None) False >>& ...

  6. Nginx 访问日志配置

    一.Nginx 访问日志介绍 Nginx 软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由 ngx_http_log_module 模块负责. 二. ...

  7. cmake 常用变量和常用环境变量查表手册---整理 .

    一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种 ...

  8. 译: 5. RabbitMQ Spring AMQP 之 Topic 主题

    在上一个教程中,我们提高了消息传递的灵活 我们使用direct交换而不是使用仅能够进行虚拟广播的fanout交换, 并且获得了基于路由key 有选择地接收消息的可能性. 虽然使用direct 交换改进 ...

  9. 物联网架构成长之路(20)-申请免费SSL证书

    0.前言 今天域名备案申请下来了,接下来就是申请个SSL证书,现在普通的网站没有SSL都不好意思见人了.可是稍微好点的企业级SSL证书还是比较贵的.不过还好有免费的可以用.只不过要定时去续时间.这个不 ...

  10. .NET+MVC+ORACLE存储分页查询一前端实现

    MemberList.cshtml @{    ViewBag.Title = "用户列表";    Layout = null;} <!DOCTYPE html> & ...