django arya插件对数据库操作使用,reverse发娘解析url的使用

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
arya 项目 01  (主要学习reverse方法,逆向解析url)
一、项目结构(只列出使用的文件)
 
-  learnmodelform    项目目录
     -  app01    第一个app
         model.py    数据库文件
         arya.py    引用插件
         
     -  arya    第二个app
         apps.py    加载自动搜索模块,django启动时自动搜索该我文件配置的模块
         -  service    arya逻辑文件目录
             v1.py    逻辑代码文件,主要用来配置url,table表单展示数据,数据库操作等
     -  learnmodelform 
           settings.py  配置文件
           urls.py    路由文件
           
     -  templates    模板文件
     
    model.py代码:
    from  django.db  import  models
 
     # Create your models here.
     
     class  Role(models.Model):
         caption  =  models.CharField(max_length = 32 )
     
         def  __str__( self ):
             return  self .caption
     
     class  UserType(models.Model):
         title  =  models.CharField(max_length = 32 )
     
         def  __str__( self ):
             return  self .title
     
     class  UserInfo(models.Model):
         name  =  models.CharField(max_length = 32 )
         pwd  =  models.CharField(max_length = 32 )
         email  =  models.CharField(max_length = 32 )
     
         ut  =  models.ForeignKey(to = "UserType" , blank = True ,null = True )
     
         roles  =  models.ManyToManyField(to = "Role" ,blank = True )
     
         def  __str__( self ):
             return  self .name
             
   arya.py代码:
     from  arya.service  import  v1
     from  import  models
     
     """
     {
         models.UserInfo: AryaConfig(models.UserInfo,site),
         models.UserType: AryaConfig(models.UserType,site),
     }
     """
     
     class  UserInfoConfig(v1.AryaConfig):
         list_display  =  [ 'name' 'pwd' 'id' 'email' ]
     
     v1.site.register(models.UserInfo,UserInfoConfig)
     
     class  UserTypeConfig(v1.AryaConfig):
         list_display  =  [ 'id' 'title' ]
     
     v1.site.register(models.UserType, UserTypeConfig)
     
     class  RoleConfig(v1.AryaConfig):
         list_display  =  [ 'id' 'caption' ]
     
     v1.site.register(models.Role,RoleConfig)  
     
     
     
  apps.py代码(在arya应用中)
      from  django.apps  import  AppConfig
     
     
     class  AryaConfig(AppConfig):
         name  =  'arya'
     
         def  ready( self ):
             from  django.utils.module_loading  import  autodiscover_modules
             autodiscover_modules( 'arya' )
             
  v1.py代码:
      from  django.shortcuts  import  HttpResponse,render,redirect
     from  django.utils.safestring  import  mark_safe
     from  django.urls  import  reverse
     
     class  AryaConfig( object ):
         list_display  =  []
     
         def  get_list_display( self ):
             result  =  []
             result.extend( self .list_display)
             # 如果有编辑权限   #reslut=['name', 'pwd', 'id', 'email']
             result.append(AryaConfig.row_edit)
             # 如果有删除权限
             result.append(AryaConfig.row_del)
     
             result.insert( 0 , AryaConfig.row_checkbox)
     
             return  result
     
         def  row_del( self ,row):
             # return row.name + row.email+str(row.id)
             # 生成删除URL
             # app01_userinfo_delete
             app  =  self .model_class._meta.app_label   #app名
             md  =  self .model_class._meta.model_name
             name  =  "arya:%s_%s_delete"  % (app,md,)   # arya:app01_userinfo_delete
             url  =  reverse(viewname = name, args = (row. id ,))     #逆向解析url
             print (url)
             return  mark_safe( "<a href='{0}'>删除</a>" . format (url))
     
         def  row_edit( self ,row):
             # return row.name + row.email+str(row.id)
             # 生成编辑URL
             #  app01_userinfo_change
             app  =  self .model_class._meta.app_label
             md  =  self .model_class._meta.model_name
             name  =  "arya:%s_%s_change"  % (app, md,)  # arya:app01_userinfo_change  必须按照这种格式,change是视图函数
             url  =  reverse(viewname = name,args = (row. id ,))
             return  mark_safe( "<a href='{0}'>编辑</a>" . format (url))
     
         def  row_checkbox( self ,row):
             return  mark_safe( "<input type='checkbox' value='{0}' />" . format (row. id ))
     
         def  __init__( self , model_class,site):
             self .model_class  =  model_class
             self .site  =  site
     
         @ property
         def  urls( self ):
             from  django.conf.urls  import  url, include
             # self.model_class # UserInfo,UserGroup
             app  =  self .model_class._meta.app_label
             md  =  self .model_class._meta.model_name
     
             partterns  =  [
                 url(r '^$' self .changelist_view, name = "%s_%s_list"  % (app, md,)),
                 url(r '^add/' , self .add_view,name = "%s_%s_add"  % (app,md,)),
                 url(r '^(\d+)/change/' , self .change_view,name = "%s_%s_change"  % (app,md,)),
                 url(r '^(\d+)/delete/' , self .delete_view,name = "%s_%s_delete"  % (app,md,)),
             ]
             return  partterns
     
         def  changelist_view( self ,request):
             """
             访问列表页面
             self =  AryaConfig对象1(UserInfo),model_class=UserInfo
             /userinfo/
             /userinfo/add/
             /userinfo/1/delete/
             /userinfo/1/change/
             self.model_class = UserInfo
             /usertype/
             /usertype/add/
             /usertype/1/delete/
             /usertype/1/change/
             self.model_class = UserType
     
             :param request:
             :return:
             """
             table_data  =  []
             queryset  =  self .model_class.objects. all ()
             # [obj,obj,obj,obj]
             # list_display = ['name','pwd','email']
             for  obj  in  queryset:
                 row  =  []
                 for  str_func  in  self .get_list_display():
                     if  isinstance (str_func, str ):
                         col  =  getattr (obj,str_func)
                     else :
                         col  =  str_func( self ,obj)
                     row.append(col)
                 table_data.append(row)
     
             return  render(request, 'changelist.html' ,{ 'table_data' : table_data})
     
         def  add_view( self ,request):
             return  HttpResponse( '添加页面' )
     
         def  change_view( self ,request,nid):
         # obj = self.model_class.objects.filter(id=nid).first()
     
             return  HttpResponse( '修改页面' )
     
         def  delete_view( self ,request,nid):
             # self.model_class.objects.filter(id=nid).delete()
             return  HttpResponse( '删除页面' )
     
     
     class  AryaSite( object ):
         def  __init__( self ):
             self ._registry  =  {}
     
         def  register( self , class_name, config_class):
             """
             self._registry = {
                 models.UserInfo: obj1 = AryaConfig(models.UserInfo,site),
                 models.UserType: obj2 = AryaConfig(models.UserType,site),
             }
             :param class_name:
             :param config_class:
             :return:
             """
             self ._registry[class_name]  =  config_class(class_name, self )
     
         @ property
         def  urls( self ):
             from  django.conf.urls  import  url, include
             partterns  =  [
                 url(r '^login/' self .login),
                 url(r '^logout/' self .logout),
             ]
     
             for  model_class,arya_config_obj  in  self ._registry.items():
                 app_model_name  =  r '^{0}/{1}/' . format (model_class._meta.app_label,model_class._meta.model_name)   #/app名/模块名/
                 pt  =  url(app_model_name, (arya_config_obj.urls, None , None ))
                 partterns.append(pt)
     
             return  partterns
     
         def  login( self ,request):
             from  django.shortcuts  import  HttpResponse
             return  HttpResponse( 'Login' )
     
         def  logout( self ,request):
             from  django.shortcuts  import  HttpResponse
             return  HttpResponse( 'Logout' )
     
     site  =  AryaSite()
     
     
urls.py代码:
from  django.conf.urls  import  url,include
from  django.contrib  import  admin
from  arya.service  import  v1
 
urlpatterns  =  [
     url(r '^admin/' , admin.site.urls),
     url(r 'arya/' , (v1.site.urls, None , 'arya' )),
]
     
 
settings.py修改install_app
'arya.apps.AryaConfig' ,
'app01'
 
 
changelist.html 模板代码:
   <!DOCTYPE html>
<html lang = "en" >
<head>
     <meta charset = "UTF-8" >
     <title>Title< / title>
< / head>
<body>
     <table border = "1" >
  { %  for  row  in  table_data  % }
             <tr>
  { %  for  col  in  row  % }
                 <td>{{ col }}< / td>
  { %  endfor  % }
             < / tr>
  { %  endfor  % }
     < / table>
< / body>
< / html>
 
 
 
二、ModelForm插件用法(其他代码参考一)
views.py代码:
from  django.shortcuts  import  render,redirect
 
# Create your views here.
from  django.forms  import  ModelForm
from  import  models
 
class  TestModelForm(ModelForm):
     class  Meta:
         # model = models.UserInfo
         model  =  models.UserType
         fields  =  "__all__"
 
def  test(request):
     if  request.method  = =  "GET" :
         obj  =  TestModelForm()
         return  render(request, 'test.html' , { 'obj' :obj})
     else :
         obj  =  TestModelForm(data = request.POST)
         if  obj.is_valid():
             obj.save()
             return  redirect( '/arya/app01/usertype/' )
         return  render(request, 'test.html' , { 'obj' :obj})
 
def  edit(request,nid):
     # user_obj = models.UserInfo.objects.filter(id=nid).first()
     user_obj  =  models.UserType.objects. filter ( id = nid).first()
     if  request.method  = =  'GET' :
         obj  =  TestModelForm(instance = user_obj)
         return  render(request, 'edit.html' ,{ 'obj' :obj})
     else :
         obj  =  TestModelForm(instance = user_obj,data = request.POST)
         if  obj.is_valid():
             obj.save()
             return  redirect( '/arya/app01/usertype/' )
         return  render(request,  'edit.html' , { 'obj' :obj})
         
         
  urls.py
  from  django.conf.urls  import  url,include
from  django.contrib  import  admin
from  arya.service  import  v1
from  app01  import  views
 
urlpatterns  =  [
     url(r '^admin/' , admin.site.urls),
     url(r 'arya/' , (v1.site.urls, None , 'arya' )),
     url(r '^test/' ,views.test),
     url(r '^edit/(\d+)/' ,views.edit),
]
 
 
test.html
<!DOCTYPE html>
<html lang = "en" >
<head>
     <meta charset = "UTF-8" >
     <title>Title< / title>
< / head>
<body>
<h1>添加页面< / h1>
<form method = "POST"  novalidate>
  { %  csrf_token  % }
     {{ obj.as_p }}
     < input  type = "submit"  value = "提交" >
< / form>
< / body>
< / html>
 
edit.html
<!DOCTYPE html>
<html lang = "en" >
<head>
     <meta charset = "UTF-8" >
     <title>Title< / title>
< / head>
<body>
<h1>编辑页面< / h1>
<form method = "POST"  novalidate>
  { %  csrf_token  % }
     {{ obj.as_p }}
     < input  type = "submit"  value = "提交" >
< / form>
< / body>
< / html>








     本文转自小白的希望 51CTO博客,原文链接:http://blog.51cto.com/haoyonghui/2044721 ,如需转载请自行联系原作者







相关文章
|
28天前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
1月前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
108 6
|
1月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
110 57
|
10天前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
|
26天前
|
SQL 数据可视化 数据库
多维度解析低代码:从技术架构到插件生态
本文深入解析低代码平台,涵盖技术架构、插件生态及应用价值。通过图形化界面和模块化设计,低代码平台降低开发门槛,提升效率,支持企业快速响应市场变化。重点分析开源低代码平台的优势,如透明架构、兼容性与扩展性、可定制化开发等,探讨其在数据处理、功能模块、插件生态等方面的技术特点,以及未来发展趋势。
|
25天前
|
SQL 数据可视化 数据库
多维度解析低代码:从技术架构到插件生态
本文深入解析低代码平台,从技术架构到插件生态,探讨其在企业数字化转型中的作用。低代码平台通过图形化界面和模块化设计降低开发门槛,加速应用开发与部署,提高市场响应速度。文章重点分析开源低代码平台的优势,如透明架构、兼容性与扩展性、可定制化开发等,并详细介绍了核心技术架构、数据处理与功能模块、插件生态及数据可视化等方面,展示了低代码平台如何支持企业在数字化转型中实现更高灵活性和创新。
49 1
|
28天前
|
SQL 存储 Oracle
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率
|
29天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
1天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

推荐镜像

更多