一、数据列表

  设计查页面,主要展示两部分内容,表头部分和数据部分, 表头通过遍历list_display和默认要显示的编辑和删除字段。

1、数据构建

(1)service/stark.py,后台数据构建

  1. class ModelStark(object):
  2. """定制配置类"""
  3. list_display = []
  4.  
  5. def __init__(self, model, site):
  6. self.model = model
  7. self.site = site
  8. '''省略其他代码'''
  9.  
  10. def list_view(self, request):
  11. print("self.model:", self.model) # self.model: <class 'app01.models.UserInfo'>
  12. print("list_display", self.list_display) # list_display ['pk', 'name', 'age']
  13. data_list = self.model.objects.all() # 拿到对应表所有的对象
  14.  
  15. new_data_list = []
  16. for obj in data_list: # 所查询表中的一个个对象
  17. temp = []
  18. for field in self.list_display: # field为一个个字段字符串
  19. val = getattr(obj, field) # obj.name obj.age
  20. temp.append(val)
  21.   new_data_list.append(temp)
  22.  
  23. return render(request, "list_view.html", locals())
  24.  
  25. '''省略其他代码'''

(2)list_view.html模板展示

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
  7. </head>
  8. <body>
  9. <h4>数据列表</h4>
  10. <div class="container">
  11. <div class="row">
  12. <div class="col-md-9">
  13. <table class="table table-bordered table-striped">
  14. <thead></thead>
  15. <tbody>
  16. {% for data in new_data_list %}
  17. <tr>
  18. {% for item in data %}
  19. <td>{{ item }}</td>
  20. {% endfor %}
  21. </tr>
  22. {% endfor %}
  23.  
  24. </tbody>
  25. </table>
  26. </div>
  27. </div>
  28. </div>
  29. </body>
  30. </html>

  显示效果:

  

注意:

(1)由于UserConfig类是ModelStark类的子类,且两边都有list_display变量。

  如果list_display有值就按里面的字段展示,如果没有值按照默认的obj展示。

app01/stark.py:

  1. # 自定义配置类
  2. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  3. list_display = ["pk", "name", "age"]

  根据父类子类关系,从调用者类里去找x,如果调用者中没有x,去父类找:

  1. class A(object):
  2. x = 12
  3.  
  4. def func(self):
  5. print(self.x)
  6.  
  7. class B(A):
  8. x = 5
  9.  
  10. b = B()
  11. b.func() # 5

(2)字符串找对象的属性,反射

  1. data_list = self.model.objects.all() # 拿到对应表所有的对象
  2. new_data_list = []
  3. for obj in data_list: # 所查询表中的一个个对象
  4. temp = []
  5. for field in self.list_display: # field为一个个字段字符串
  6. val = getattr(obj, field) # obj.name obj.age
  7.  
  8. temp.append(val)
  9.  
  10.   new_data_list.append(temp)
  11.  

  字符串不是变量名称,无法进行点字符串操作。

  1. class Person(object):
  2. def __init__(self, name):
  3. self.name = name
  4.  
  5. alex = Person("alex")
  6.  
  7. s = "name"
  8.  
  9. # 直接alex.s 或者alex."name"都是取不到值的
  10. print(getattr(alex, s)) # alex

2、编辑按钮构建

  1. from django.conf.urls import url
  2. from django.shortcuts import HttpResponse,render
  3.  
  4. class ModelStark(object):
  5. """定制配置类"""
  6. list_display = []
  7.  
  8. def __init__(self, model, site):
  9. self.model = model
  10. self.site = site
  11.  
  12. def add(self, request):
  13. return HttpResponse("add")
  14.  
  15. def delete(self, request, id):
  16. return HttpResponse("delete")
  17.  
  18. def change(self, request, id):
  19. return HttpResponse("change")
  20.  
  21. def list_view(self, request):
  22. print("self.model:", self.model) # self.model: <class 'app01.models.UserInfo'>
  23.  
  24. print("list_display", self.list_display) # list_display ['pk', 'name', 'age']
  25.  
  26. data_list = self.model.objects.all() # 拿到对应表所有的对象
  27.  
  28. new_data_list = []
  29. for obj in data_list: # 所查询表中的一个个对象
  30. temp = []
  31. for field in self.list_display: # field为一个个字段字符串 ['pk', 'name', 'age', edit]
  32. if callable(field): # 用于判断是否是函数,可调用的是方法,不可调用的是属性
  33. val = field(self, obj) # edit(self, obj) obj是当前正在处理的这个记录
  34. else:
  35. val = getattr(obj, field) # 一定要是属性才能这么去调用, obj.name obj.age
  36.  
  37. temp.append(val)
  38.  
  39. new_data_list.append(temp)
  40.  
  41. return render(request, "list_view.html", locals())
  42.  
  43. def get_urls_2(self):
  44. temp = []
  45.  
  46. # 用name取别名app名+model名+操作名可以保证别名不会重复
  47. model_name = self.model._meta.model_name
  48. app_label = self.model._meta.app_label
  49. temp.append(url(r"^add/", self.add, name="%s_%s_add" % (app_label, model_name)))
  50. temp.append(url(r"^(\d+)/delete/", self.delete, name="%s_%s_delete" % (app_label, model_name)))
  51. temp.append(url(r"^(\d+)/change/", self.change, name="%s_%s_change" % (app_label, model_name)))
  52. temp.append(url(r"^$", self.list_view, name="%s_%s_list" % (app_label, model_name)))
  53. return temp
  54.  
  55. @property
  56. def urls_2(self):
  57. return self.get_urls_2(), None, None # [], None, None
  58.  
  59. class StarkSite(object):
  60. """site单例类"""
  61. def __init__(self):
  62. self._registry = {}
  63.  
  64. def register(self, model, stark_class=None, **options):
  65. """注册"""
  66. if not stark_class:
  67. # 如果注册的时候没有自定义配置类,执行
  68. stark_class = ModelStark # 配置类
  69.  
  70. # 将配置类对象加到_registry字典中,键为模型类
  71. self._registry[model] = stark_class(model, self) # _registry={'model':admin_class(model)}
  72.  
  73. def get_urls(self):
  74. """构造一层url"""
  75. temp = []
  76. for model, stark_class_obj in self._registry.items():
  77. # model:一个模型表
  78. # stark_class_obj:当前模型表相应的配置类对象
  79.  
  80. model_name = model._meta.model_name
  81. app_label = model._meta.app_label
  82.  
  83. # 分发增删改查
  84. temp.append(url(r"^%s/%s/" % (app_label, model_name), stark_class_obj.urls_2))
  85. """
  86. path('app01/userinfo/',UserConfig(Userinfo,site).urls2),
  87. path('app01/book/',ModelStark(Book,site).urls2),
  88. """
  89.  
  90. return temp
  91.  
  92. @property
  93. def urls(self):
  94. return self.get_urls(), None, None
  95.  
  96. site = StarkSite() # 单例对象

/stark/service/stark.py

  1. from app01 import models
  2. from stark.service.stark import site, ModelStark
  3. from django.utils.safestring import mark_safe
  4. from django.urls import reverse
  5.  
  6. # 自定义配置类
  7. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  8.  
  9. def edit(self, obj):
  10. # 方法一:
  11. # return mark_safe("<a href='/stark/app01/userinfo/%s/change'>编辑</a>" % obj.pk)
  12. # 方法二:前面不加/就是和前面的路径拼接
  13. # return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  14. # 方法三:反向解析
  15. model_name = self.model._meta.model_name
  16. app_label = self.model._meta.app_label
  17. # _url = reverse("%s_%s_add" % (app_label, model_name))
  18. # print("_url", _url) # _url /stark/app01/userinfo/add/
  19.  
  20. # stark/app01/userinfo/(/d+)/change
  21. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk, ))
  22. print("_url", _url) # _url /stark/app01/userinfo/3/change/
  23. return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  24.  
  25. def deletes(self, obj):
  26. model_name = self.model._meta.model_name
  27. app_label = self.model._meta.app_label
  28. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk, ))
  29. print("_url", _url) # _url /stark/app01/userinfo/3/change/
  30. return mark_safe("<a href='%s/change'>删除</a>" % obj.pk)
  31.  
  32. list_display = ["pk", "name", "age", edit, deletes]
  33.  
  34. site.register(models.UserInfo, UserConfig)
  35. site.register(models.Book)
  36.  
  37. print("_registry", site._registry)

app01/stark.py

注意:

(1)利用callable方法判断是函数还是属性

  1. if callable(field): # 用于判断是否是函数,可调用的是方法,不可调用的是属性
  2. val = field(self)
  3. else:
  4. val = getattr(obj, field) # 一定要是属性才能这么去调用, obj.name obj.age
  5. temp.append(val)

(2)区分类的实例方法与函数调用及self参数

  1. class Person(object):
  2. def __init__(self, name):
  3. self.name = name
  4.  
  5. def eat(self):
  6. print(self)
  7. print("eat.....")
  8.  
  9. # 实例方法
  10. egon = Person("egon")
  11. egon.eat()
  12. """
  13. <__main__.Person object at 0x10401ae48>
  14. eat.....
  15. """
  16.  
  17. # 函数
  18. Person.eat(123)
  19. """
  20. 123
  21. eat.....
  22. """

(3)阻止<a>编辑</a>转义

  1. from django.utils.safestring import mark_safe
  2.  
  3. # 自定义配置类
  4. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  5.  
  6. def edit(self):
  7. return mark_safe("<a>编辑</a>")
  8.  
  9. list_display = ["pk", "name", "age", edit]

  显示效果:

  

(4)实现点击编辑进入编辑页面

  startk/service/stark.py中的list_view函数中,在判断filed是函数时,给这个函数还传入一个obj也就是当前正在处理的记录对象:

  1. class ModelStark(object):
  2. def list_view(self, request):
  3. for obj in data_list: # 所查询表中的一个个对象
  4. temp = []
  5. for field in self.list_display: # field为一个个字段字符串 ['pk', 'name', 'age', edit]
  6. if callable(field): # 用于判断是否是函数,可调用的是方法,不可调用的是属性
  7. val = field(self, obj) # edit(self, obj) obj是当前正在处理的这个记录
  8. else:
  9. val = getattr(obj, field) # 一定要是属性才能这么去调用, obj.name obj.age
  10.  
  11. temp.append(val)
  12.  
  13. new_data_list.append(temp)

  前面已经实现实现了编辑按钮,现在需要在app01/stark.py中为edit方法返回值配好返回的a标签的href路径:

  1. from app01 import models
  2. from stark.service.stark import site, ModelStark
  3. from django.utils.safestring import mark_safe
  4.  
  5. # 自定义配置类
  6. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  7. def edit(self, obj):
  8. # 方法一:
  9. # return mark_safe("<a href='/stark/app01/userinfo/%s/change'>编辑</a>" % obj.pk)
  10. # 方法二:前面不加/就是和前面的路径拼接
  11. return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  12.  
  13. list_display = ["pk", "name", "age", edit]

  显示效果:

  

(5)用反向解析实现路径返回

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

  首先给urls用name添加别名:app名+model名+操作名可以保证别名不重复

  1. class ModelStark(object):
  2. """定制配置类"""
  3. '''省略内容'''
  4. def get_urls_2(self):
  5. temp = []
  6.  
  7. # 用name取别名app名+model名+操作名可以保证别名不会重复
  8. model_name = self.model._meta.model_name
  9. app_label = self.model._meta.app_label
  10. temp.append(url(r"^add/", self.add, name="%s_%s_add" % (app_label, model_name)))
  11. temp.append(url(r"^(\d+)/delete/", self.delete, name="%s_%s_delete" % (app_label, model_name)))
  12. temp.append(url(r"^(\d+)/change/", self.change, name="%s_%s_change" % (app_label, model_name)))
  13. temp.append(url(r"^$", self.list_view, name="%s_%s_list" % (app_label, model_name)))
  14. return temp

  路由效果如下所示:

  

  再在app01/stark.py中edit方法以反向解析解析路径:

  1. from app01 import models
  2. from stark.service.stark import site, ModelStark
  3. from django.utils.safestring import mark_safe
  4. from django.urls import reverse
  5.  
  6. # 自定义配置类
  7. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  8. def edit(self, obj):
  9. # 方法一:
  10. # return mark_safe("<a href='/stark/app01/userinfo/%s/change'>编辑</a>" % obj.pk)
  11. # 方法二:前面不加/就是和前面的路径拼接
  12. # return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  13. # 方法三:反向解析
  14. model_name = self.model._meta.model_name
  15. app_label = self.model._meta.app_label
  16. # _url = reverse("%s_%s_add" % (app_label, model_name))
  17. # print("_url", _url) # _url /stark/app01/userinfo/add/
  18.  
  19. # stark/app01/userinfo/(/d+)/change
  20. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk, ))
  21. print("_url", _url) # _url /stark/app01/userinfo/3/change/
  22. return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  23.  
  24. list_display = ["pk", "name", "age", edit]
  25.  
  26. site.register(models.UserInfo, UserConfig)

  点击按钮显示效果同上。

(6)添加删除功能

  1. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  2.  
  3. def edit(self, obj):...
  4.  
  5. def deletes(self, obj):
  6. model_name = self.model._meta.model_name
  7. app_label = self.model._meta.app_label
  8. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk, ))
  9. print("_url", _url) # _url /stark/app01/userinfo/3/change/
  10. return mark_safe("<a href='%s/change'>删除</a>" % obj.pk)
  11.  
  12. list_display = ["pk", "name", "age", edit, deletes]

  显示效果如下:

  

(7)添加复选框按钮

  1. def checkbox(self, obj):
  2. """复选框"""
  3. return mark_safe("<input type='checkbox'>")

  显示效果:

  

二、构建表头并应用于所有列表对象

1、编辑编辑、删除、复选框函数,同时要实现每个表都能实现这些操作

  1. class ModelStark(object):
  2. """默认类,定制配置类"""
  3. list_display = ["__str__",]
  4.  
  5. def __init__(self, model, site):
  6. self.model = model
  7. self.site = site
  8.  
  9. # 删除、编辑,复选框
  10. def edit(self, obj):
  11. """编辑"""
  12. # 方法三:反向解析
  13. model_name = self.model._meta.model_name
  14. app_label = self.model._meta.app_label
  15. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk, ))
  16. print("_url", _url)
  17. return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  18.  
  19. def deletes(self, obj):
  20. """删除"""
  21. model_name = self.model._meta.model_name
  22. app_label = self.model._meta.app_label
  23. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk, ))
  24. print("_url", _url)
  25. return mark_safe("<a href='%s/change'>删除</a>" % obj.pk)
  26.  
  27. def checkbox(self, obj):
  28. """复选框"""
  29. return mark_safe("<input type='checkbox'>")
  30.  
  31. '''代码省略'''
  32.  
  33. def new_list_display(self):
  34. """返回新的列表"""
  35. temp = []
  36. temp.append(ModelStark.checkbox) # 在列表中放一个checkbox名字
  37. temp.extend(self.list_display) # 扩展进一个列表["pk","name","age"]
  38. temp.append(ModelStark.edit) # edit函数名
  39. temp.append(ModelStark.deletes) # deletes函数名
  40.  
  41. return temp # 返回新的列表
  42.  
  43. def list_view(self, request):
  44. """循环展示"""
  45. print("self.model:", self.model) # self.model: <class 'app01.models.UserInfo'>
  46.  
  47. print("list_display", self.list_display) # list_display ['pk', 'name', 'age']
  48.  
  49. data_list = self.model.objects.all() # 拿到对应表所有的对象
  50.  
  51. """构建表单数据"""
  52. new_data_list = []
  53.  
  54. for obj in data_list:
  55. temp = []
  56.  
  57. for field in self.new_list_display(): # ["__str__", ] ["pk","name","age",edit]
  58.  
  59. if callable(field):
  60. val = field(self, obj)
  61. else:
  62. val = getattr(obj, field)
  63.  
  64. temp.append(val)
  65.  
  66. new_data_list.append(temp)
  67.  
  68. return render(request, "list_view.html", locals())

(1)不同的表都需要有这些按钮功能

  将这些函数从自定义配置类(app01/stark.py里的UserConfig)剪切到默认类(stark/service/stark.py里的ModelStark),剩下的app01/stark.py代码如下所示:

  1. from app01 import models
  2. from stark.service.stark import site, ModelStark
  3.  
  4. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  5. """自定义配置类"""
  6. list_display = ["pk", "name", "age"]
  7.  
  8. site.register(models.UserInfo, UserConfig)
  9.  
  10. class BookConfig(ModelStark):
  11. list_display = ['pk', 'title']
  12.  
  13. site.register(models.Book)
  14.  
  15. print("_registry", site._registry)

(2)self.list_display里现在只剩下普通字段,需要拼接出新的列表

  可以注意到自定义配置类的list_display已经没有了edit,delete等函数, 因此需要返回新的列表。

  1. class ModelStark(object):
  2. '''省略代码''''
  3. def new_list_display(self):
  4. """返回新的列表"""
  5. temp = []
  6. temp.append(ModelStark.checkbox) # 在列表中放一个checkbox名字
  7. temp.extend(self.list_display) # 扩展进一个列表["pk","name","age"]
  8. temp.append(ModelStark.edit) # edit函数名
  9. temp.append(ModelStark.deletes) # deletes函数名
  10.  
  11. return temp # 返回新的列表

  在list_view中调用新的的列表:

  1. def list_view(self, request):
  2. """构建表单数据"""
  3. new_data_list = []
  4. for obj in data_list:
  5. temp = []
  6. for field in self.new_list_display(): # ["__str__", ] ["pk","name","age",edit]
  7. if callable(field):
  8. val = field(self, obj)
  9. else:
  10. val = getattr(obj, field)
  11. temp.append(val)
  12. new_data_list.append(temp)
  13. return render(request, "list_view.html", locals())

(3)不同的表具有不同的自定义配置类,每个的list_display都不相同,对应表取对应的list_display

  1. ##################stark/service/stark.py###############
  2. class ModelStark(object):
  3. """默认类,定制配置类"""
  4. list_display = ["__str__",]
  5.  
  6. ##################app01/stark.py##################
  7. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  8. """自定义配置类"""
  9. list_display = ["pk", "name", "age"]
  10.  
  11. class BookConfig(ModelStark):
  12. list_display = ['pk', 'title']

  这里涉及到类的__str__方法使用,示例如下:

  1. class Persoon(object):
  2.  
  3. def __init__(self, name):
  4. self.name = name
  5.  
  6. def __str__(self):
  7. return self.name
  8.  
  9. alex = Persoon("alex")
  10. print(alex.__str__)
  11. print(alex.__str__())
  12. print(str(alex))
  13. """'
  14. <bound method Persoon.__str__ of <__main__.Persoon object at 0x10401ae48>>
  15. alex
  16. alex
  17. """

(4)根据models.py中模型是否具有def __str__(self),页面上字段显示不同

  

  

2、构建表头

  1. # -*- coding:utf-8 -*-
  2. __author__ = 'Qiushi Huang'
  3.  
  4. from django.conf.urls import url
  5. from django.shortcuts import HttpResponse, render
  6. from django.utils.safestring import mark_safe
  7. from django.urls import reverse
  8.  
  9. class ModelStark(object):
  10. """默认类,定制配置类"""
  11. list_display = ["__str__",]
  12.  
  13. def __init__(self, model, site):
  14. self.model = model
  15. self.site = site
  16.  
  17. # 删除、编辑,复选框
  18. def edit(self, obj=None, header=False):
  19. """编辑"""
  20. if header:
  21. # 如果是表头显示操作
  22. return "操作"
  23.  
  24. # 方法三:反向解析
  25. model_name = self.model._meta.model_name
  26. app_label = self.model._meta.app_label
  27. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk, ))
  28. print("_url", _url)
  29. return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  30.  
  31. def deletes(self, obj=None, header=False):
  32. """删除"""
  33. if header:
  34. # 如果是表头显示操作
  35. return "操作"
  36. model_name = self.model._meta.model_name
  37. app_label = self.model._meta.app_label
  38. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk, ))
  39. print("_url", _url)
  40. return mark_safe("<a href='%s/change'>删除</a>" % obj.pk)
  41.  
  42. def checkbox(self, obj=None, header=False):
  43. """复选框"""
  44. if header:
  45. # 如果是表头显示操作
  46. return mark_safe("<input id='choice' type='checkbox'>")
  47.  
  48. return mark_safe("<input class='choice_item' type='checkbox'>")
  49.  
  50. def add(self, request):
  51. return HttpResponse("add")
  52.  
  53. def delete(self, request, id):
  54. return HttpResponse("delete")
  55.  
  56. def change(self, request, id):
  57. return HttpResponse("change")
  58.  
  59. def new_list_display(self):
  60. """返回新的列表"""
  61. temp = []
  62. temp.append(ModelStark.checkbox) # 在列表中放一个checkbox名字
  63. temp.extend(self.list_display) # 扩展进一个列表["pk","name","age"]
  64. temp.append(ModelStark.edit) # edit函数名
  65. temp.append(ModelStark.deletes) # deletes函数名
  66.  
  67. return temp # 返回新的列表
  68.  
  69. def list_view(self, request):
  70. """循环展示"""
  71. print("self.model:", self.model) # self.model: <class 'app01.models.UserInfo'>
  72.  
  73. print("list_display", self.list_display) # list_display ['pk', 'name', 'age'] list_display ['__str__']
  74.  
  75. data_list = self.model.objects.all() # 拿到对应表所有的对象
  76.  
  77. """构建表头"""
  78. header_list = []
  79. print("header", self.new_list_display()) # [checkbox ,"__str__", edit ,deletes]
  80.  
  81. for field in self.new_list_display():
  82.  
  83. if callable(field):
  84. # 如果是函数
  85. val = field(self, header=True)
  86. header_list.append(val)
  87.  
  88. else:
  89. # 如果是字符串
  90. if field == "__str__":
  91. header_list.append(self.model._meta.model_name.upper()) # 当前模型表名
  92. else:
  93. # 如果不是"__str__"
  94. # header_list.append(field)
  95. val = self.model._meta.get_field(field).verbose_name
  96. header_list.append(val)
  97.  
  98. """构建表单数据"""
  99. new_data_list = []
  100.  
  101. for obj in data_list:
  102. temp = []
  103.  
  104. for field in self.new_list_display(): # ["__str__", ] ["pk","name","age",edit]
  105.  
  106. if callable(field):
  107. val = field(self, obj)
  108. else:
  109. val = getattr(obj, field)
  110.  
  111. temp.append(val)
  112.  
  113. new_data_list.append(temp)
  114.  
  115. return render(request, "list_view.html", locals())
  116.  
  117. def get_urls_2(self):
  118. temp = []
  119.  
  120. # 用name取别名app名+model名+操作名可以保证别名不会重复
  121. model_name = self.model._meta.model_name
  122. app_label = self.model._meta.app_label
  123. temp.append(url(r"^add/", self.add, name="%s_%s_add" % (app_label, model_name)))
  124. temp.append(url(r"^(\d+)/delete/", self.delete, name="%s_%s_delete" % (app_label, model_name)))
  125. temp.append(url(r"^(\d+)/change/", self.change, name="%s_%s_change" % (app_label, model_name)))
  126. temp.append(url(r"^$", self.list_view, name="%s_%s_list" % (app_label, model_name)))
  127. return temp
  128.  
  129. @property
  130. def urls_2(self):
  131. return self.get_urls_2(), None, None # [], None, None
  132.  
  133. class StarkSite(object):
  134. """site单例类"""
  135. def __init__(self):
  136. self._registry = {}
  137.  
  138. def register(self, model, stark_class=None, **options):
  139. """注册"""
  140. if not stark_class:
  141. # 如果注册的时候没有自定义配置类,执行
  142. stark_class = ModelStark # 配置类
  143.  
  144. # 将配置类对象加到_registry字典中,键为模型类
  145. self._registry[model] = stark_class(model, self) # _registry={'model':admin_class(model)}
  146.  
  147. def get_urls(self):
  148. """构造一层url"""
  149. temp = []
  150. for model, stark_class_obj in self._registry.items():
  151. # model:一个模型表
  152. # stark_class_obj:当前模型表相应的配置类对象
  153.  
  154. model_name = model._meta.model_name
  155. app_label = model._meta.app_label
  156.  
  157. # 分发增删改查
  158. temp.append(url(r"^%s/%s/" % (app_label, model_name), stark_class_obj.urls_2))
  159. """
  160. path('app01/userinfo/',UserConfig(Userinfo,site).urls2),
  161. path('app01/book/',ModelStark(Book,site).urls2),
  162. """
  163.  
  164. return temp
  165.  
  166. @property
  167. def urls(self):
  168. return self.get_urls(), None, None
  169.  
  170. site = StarkSite() # 单例对象

service/stark.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
  7. <script src="/static/js/jquery-1.12.4.min.js"></script>
  8. </head>
  9. <body>
  10. <h4>数据列表</h4>
  11. <div class="container">
  12. <div class="row">
  13. <div class="col-md-9">
  14. <table class="table table-bordered table-striped">
  15. <thead>
  16. <tr>
  17. {% for item in header_list %}
  18. <th>{{ item }}</th>
  19. {% endfor %}
  20. </tr>
  21. </thead>
  22. <tbody>
  23. {% for data in new_data_list %}
  24. <tr>
  25. {% for item in data %}
  26. <td>{{ item }}</td>
  27. {% endfor %}
  28. </tr>
  29. {% endfor %}
  30.  
  31. </tbody>
  32. </table>
  33. </div>
  34. </div>
  35. </div>
  36. <script>
  37. // 复选框全选
  38. $("#choice").click(function () {
  39. if($(this).prop("checked")) {
  40. // 如果是选中状态
  41. $(".choice_item").prop("checked", true);
  42. } else {
  43. $(".choice_item").prop("checked", false)
  44. }
  45. })
  46. </script>
  47. </body>
  48. </html>

list_view.html

(1)__name__

  __name__是标识模块的名字的一个系统变量;__main__一般作为函数的入口,类似于C语言,尤其在大型工程中,常常有if __name__ == "__main__":来表明整个工程开始运行的入口。

  1. def foo():
  2. return
  3.  
  4. print(foo.__name__) # foo

(2)将表头自定义函数显示改为中文

  1. def list_view(self, request):
  2.  
  3. """构建表头"""
  4. header_list = []
  5. print("header", self.new_list_display()) # [checkbox ,"__str__", edit ,deletes]
  6.  
  7. for field in self.new_list_display():
  8.  
  9. if callable(field):
  10. # 如果是函数
  11. val = field(self, header=True)
  12. header_list.append(val)
  13.  
  14. else:
  15. # 如果是字符串
  16. if field == "__str__":
  17. header_list.append(self.model._meta.model_name.upper()) # 当前模型表名
  18. else:
  19. # 如果不是"__str__"
  20. header_list.append(field)

  当callable判断field是函数时,给函数传参数header=True。修改编辑、删除、选择函数:

  1. # 删除、编辑,复选框
  2. def edit(self, obj=None, header=False):
  3. """编辑"""
  4. if header:
  5. # 如果是表头显示操作
  6. return "操作"
  7.  
  8. # 方法三:反向解析
  9. model_name = self.model._meta.model_name
  10. app_label = self.model._meta.app_label
  11. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk, ))
  12. print("_url", _url)
  13. return mark_safe("<a href='%s/change'>编辑</a>" % obj.pk)
  14.  
  15. def deletes(self, obj=None, header=False):
  16. """删除"""
  17. if header:
  18. # 如果是表头显示操作
  19. return "操作"
  20. model_name = self.model._meta.model_name
  21. app_label = self.model._meta.app_label
  22. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk, ))
  23. print("_url", _url)
  24. return mark_safe("<a href='%s/change'>删除</a>" % obj.pk)
  25.  
  26. def checkbox(self, obj=None, header=False):
  27. """复选框"""
  28. if header:
  29. # 如果是表头显示操作
  30. return "选择"
  31.  
  32. return mark_safe("<input type='checkbox'>")

  显示效果:

  

(3)将普通字段修改为中文

  1. def list_view(self, request):
  2. """构建表头"""
  3. header_list = []
  4. print("header", self.new_list_display()) # [checkbox ,"__str__", edit ,deletes]
  5. for field in self.new_list_display():
  6. if callable(field):
  7. # 如果是函数
  8. val = field(self, header=True)
  9. header_list.append(val)
  10. else:
  11. # 如果是字符串
  12. if field == "__str__":
  13. header_list.append(self.model._meta.model_name.upper()) # 当前模型表名
  14. else:
  15. # 如果不是"__str__"
  16. # header_list.append(field)
  17. val = self.model._meta.get_field(field).verbose_name
  18. header_list.append(val)

  然后在models.py中为字段添加verbose_name属性

  1. class UserInfo(models.Model):
  2. name = models.CharField(verbose_name="姓名", max_length=32)
  3. age = models.IntegerField(verbose_name="年龄")
  4. def __str__(self):
  5. return self.name
  6.  
  7. class Book(models.Model):
  8. title = models.CharField(verbose_name="书名",max_length=32)
  9. def __str__(self):
  10. return self.title

  显示效果:

  

  注意在这里app01/stark.py中的list_display是不能添加“pk”的

  1. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  2. """自定义配置类"""
  3. list_display = ["name", "age"]
  4.  
  5. site.register(models.UserInfo, UserConfig)
  6.  
  7. class BookConfig(ModelStark):
  8. list_display = ['title']
  9.  
  10. site.register(models.Book)
  11. print("_registry", site._registry)

  因为它的主键是"id",“pk”只能是在查询的时候使用。且如果添加“id”的话,这个值也无法改为中文。

  1. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  2. """自定义配置类"""
  3. list_display = ["id", "name", "age"]

  显示效果:

  

(4)复选框点击全选事件

  将表头改为复选框,并给一个id:

  1. def checkbox(self, obj=None, header=False):
  2. """复选框"""
  3. if header:
  4. # 如果是表头显示操作
  5. return mark_safe("<input id='choice' type='checkbox'>")
  6.  
  7. return mark_safe("<input class='choice_item' type='checkbox'>")

  复选框点击全选事件:

  1. <script>
  2. // 复选框全选
  3. $("#choice").click(function () {
  4. if($(this).prop("checked")) {
  5. // 如果是选中状态
  6. $(".choice_item").prop("checked", true);
  7. } else {
  8. $(".choice_item").prop("checked", false)
  9. }
  10. })
  11. </script>

  注意这里使用js中的prop()方法来查看复选框是否选中,或设置复选框为选中或未选中状态。

  

三、设计list_display_links

1、定制列可以点击跳转

  1. class ModelStark(object):
  2. '''其他代码省略'''
  3. def new_list_display(self):
  4. """返回新的列表"""
  5. temp = []
  6. temp.append(ModelStark.checkbox) # 在列表中放一个checkbox名字
  7. temp.extend(self.list_display) # 扩展进一个列表["pk","name","age"]
  8.  
  9. if not self.list_display_links:
  10. # 如果没有值
  11. temp.append(ModelStark.edit)
  12.  
  13. # temp.append(ModelStark.edit) # edit函数名
  14. temp.append(ModelStark.deletes) # deletes函数名
  15.  
  16. return temp # 返回新的列表
  17.  
  18. def list_view(self, request):
  19. """循环展示"""
  20. print("self.model:", self.model) # self.model: <class 'app01.models.UserInfo'>
  21.  
  22. print("list_display", self.list_display) # list_display ['pk', 'name', 'age'] list_display ['__str__']
  23.  
  24. data_list = self.model.objects.all() # 拿到对应表所有的对象
  25.  
  26. """构建表头"""
  27. header_list = []
  28. print("header", self.new_list_display()) # [checkbox ,"__str__", edit ,deletes]
  29.  
  30. for field in self.new_list_display():
  31.  
  32. if callable(field):
  33. # 如果是函数
  34. val = field(self, header=True)
  35. header_list.append(val)
  36.  
  37. else:
  38. # 如果是字符串
  39. if field == "__str__":
  40. header_list.append(self.model._meta.model_name.upper()) # 当前模型表名
  41. else:
  42. # 如果不是"__str__"
  43. # header_list.append(field)
  44. val = self.model._meta.get_field(field).verbose_name
  45. header_list.append(val)
  46.  
  47. """构建表单数据"""
  48. new_data_list = []
  49.  
  50. for obj in data_list:
  51. temp = []
  52.  
  53. for field in self.new_list_display(): # ["__str__", ] ["pk","name","age",edit]
  54.  
  55. if callable(field):
  56. val = field(self, obj)
  57. else:
  58. val = getattr(obj, field)
  59. if field in self.list_display_links:
  60. model_name = self.model._meta.model_name
  61. app_label = self.model._meta.app_label
  62. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk,))
  63.  
  64. val = mark_safe("<a href='%s'>%s</a>" % (_url, val))
  65.  
  66. temp.append(val)
  67.  
  68. new_data_list.append(temp)
  69.  
  70. return render(request, "list_view.html", locals())

service/stark.py改动的部分

  不再拼接edit函数名,直接通过点击普通字段进入编辑页面。在构建表单数据时,判断字段是否在list_display_links中,如果在的话通过反向解析生成a标签指向的地址。

  再在app01/stark.py的自定义配置类添加list_display_links:

  1. class UserConfig(ModelStark): # UserConfig是ModelStark的一个子类
  2. """自定义配置类"""
  3. list_display = ["id", "name", "age"]
  4. list_display_links = ["name"]
  5.  
  6. site.register(models.UserInfo, UserConfig)
  7.  
  8. class BookConfig(ModelStark):
  9. list_display = ['title']
  10. list_display_links = ["title"]

  显示效果:

  

2、将获取的应用名、模型名组成url定义为函数

  1. class ModelStark(object):
  2. def new_list_display(self):
  3. """返回新的列表"""
  4. temp = []
  5. temp.append(ModelStark.checkbox) # 在列表中放一个checkbox名字
  6. temp.extend(self.list_display) # 扩展进一个列表["pk","name","age"]
  7.  
  8. if not self.list_display_links:
  9. # 如果没有值
  10. temp.append(ModelStark.edit)
  11.  
  12. # temp.append(ModelStark.edit) # edit函数名
  13. temp.append(ModelStark.deletes) # deletes函数名
  14.  
  15. return temp # 返回新的列表
  16.  
  17. def get_change_url(self,obj):
  18. model_name = self.model._meta.model_name
  19. app_label = self.model._meta.app_label
  20.  
  21. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk,))
  22.  
  23. return _url
  24.  
  25. def get_delete_url(self, obj):
  26. model_name = self.model._meta.model_name
  27. app_label = self.model._meta.app_label
  28.  
  29. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk,))
  30.  
  31. return _url
  32.  
  33. def get_add_url(self):
  34. model_name = self.model._meta.model_name
  35. app_label = self.model._meta.app_label
  36.  
  37. _url = reverse("%s_%s_add" % (app_label, model_name))
  38.  
  39. return _url
  40.  
  41. def get_list_url(self):.....

  将删除、编辑、复选框等函数内的url拼接代码替换后:

  1. # -*- coding:utf-8 -*-
  2. __author__ = 'Qiushi Huang'
  3.  
  4. from django.conf.urls import url
  5. from django.shortcuts import HttpResponse, render
  6. from django.utils.safestring import mark_safe
  7. from django.urls import reverse
  8.  
  9. class ModelStark(object):
  10. """默认类,定制配置类"""
  11. list_display = ["__str__",]
  12. list_display_links = []
  13.  
  14. def __init__(self, model, site):
  15. self.model = model
  16. self.site = site
  17.  
  18. # 删除、编辑,复选框
  19. def edit(self, obj=None, header=False):
  20. """编辑"""
  21. if header:
  22. # 如果是表头显示操作
  23. return "操作"
  24.  
  25. _url = self.get_change_url(obj)
  26. return mark_safe("<a href='%s'>编辑</a>" % _url)
  27.  
  28. def deletes(self, obj=None, header=False):
  29. """删除"""
  30. if header:
  31. # 如果是表头显示操作
  32. return "操作"
  33.  
  34. _url = self.get_delete_url(obj)
  35. # return mark_safe("<a href='%s/change'>删除</a>" % obj.pk)
  36. return mark_safe("<a href='%s/'>删除</a>" % _url)
  37.  
  38. def checkbox(self, obj=None, header=False):
  39. """复选框"""
  40. if header:
  41. # 如果是表头显示操作
  42. return mark_safe("<input id='choice' type='checkbox'>")
  43.  
  44. return mark_safe("<input class='choice_item' type='checkbox'>")
  45.  
  46. def add_view(self, request):
  47. return HttpResponse("add")
  48.  
  49. def delete_view(self, request, id):
  50. return HttpResponse("delete")
  51.  
  52. def change_view(self, request, id):
  53. return HttpResponse("change")
  54.  
  55. def new_list_display(self):
  56. """返回新的列表"""
  57. temp = []
  58. temp.append(ModelStark.checkbox) # 在列表中放一个checkbox名字
  59. temp.extend(self.list_display) # 扩展进一个列表["pk","name","age"]
  60.  
  61. if not self.list_display_links:
  62. # 如果没有值
  63. temp.append(ModelStark.edit)
  64.  
  65. # temp.append(ModelStark.edit) # edit函数名
  66. temp.append(ModelStark.deletes) # deletes函数名
  67.  
  68. return temp # 返回新的列表
  69.  
  70. def get_change_url(self,obj):
  71. model_name = self.model._meta.model_name
  72. app_label = self.model._meta.app_label
  73.  
  74. _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk,))
  75.  
  76. return _url
  77.  
  78. def get_delete_url(self, obj):
  79. model_name = self.model._meta.model_name
  80. app_label = self.model._meta.app_label
  81.  
  82. _url = reverse("%s_%s_delete" % (app_label, model_name), args=(obj.pk,))
  83.  
  84. return _url
  85.  
  86. def get_add_url(self):
  87.  
  88. model_name = self.model._meta.model_name
  89. app_label = self.model._meta.app_label
  90.  
  91. _url = reverse("%s_%s_add" % (app_label, model_name))
  92.  
  93. return _url
  94.  
  95. def get_list_url(self):
  96.  
  97. model_name = self.model._meta.model_name
  98. app_label = self.model._meta.app_label
  99.  
  100. _url = reverse("%s_%s_list" % (app_label, model_name))
  101.  
  102. return _url
  103.  
  104. def list_view(self, request):
  105. """循环展示"""
  106. print("self.model:", self.model) # self.model: <class 'app01.models.UserInfo'>
  107.  
  108. print("list_display", self.list_display) # list_display ['pk', 'name', 'age'] list_display ['__str__']
  109.  
  110. data_list = self.model.objects.all() # 拿到对应表所有的对象
  111.  
  112. """构建表头"""
  113. header_list = []
  114. print("header", self.new_list_display()) # [checkbox ,"__str__", edit ,deletes]
  115.  
  116. for field in self.new_list_display():
  117.  
  118. if callable(field):
  119. # 如果是函数
  120. val = field(self, header=True)
  121. header_list.append(val)
  122.  
  123. else:
  124. # 如果是字符串
  125. if field == "__str__":
  126. header_list.append(self.model._meta.model_name.upper()) # 当前模型表名
  127. else:
  128. # 如果不是"__str__"
  129. # header_list.append(field)
  130. val = self.model._meta.get_field(field).verbose_name
  131. header_list.append(val)
  132.  
  133. """构建表单数据"""
  134. new_data_list = []
  135.  
  136. for obj in data_list:
  137. temp = []
  138.  
  139. for field in self.new_list_display(): # ["__str__", ] ["pk","name","age",edit]
  140.  
  141. if callable(field):
  142. val = field(self, obj)
  143. else:
  144. val = getattr(obj, field)
  145. if field in self.list_display_links:
  146. # _url = reverse("%s_%s_change" % (app_label, model_name), args=(obj.pk,))
  147. _url = self.get_change_url(obj)
  148.  
  149. val = mark_safe("<a href='%s'>%s</a>" % (_url, val))
  150.  
  151. temp.append(val)
  152.  
  153. new_data_list.append(temp)
  154.  
  155. # 构建一个查看url
  156. add_url = self.get_add_url()
  157.  
  158. return render(request, "list_view.html", locals())
  159.  
  160. def get_urls_2(self):
  161. temp = []
  162.  
  163. # 用name取别名app名+model名+操作名可以保证别名不会重复
  164. model_name = self.model._meta.model_name
  165. app_label = self.model._meta.app_label
  166. temp.append(url(r"^add/", self.add_view, name="%s_%s_add" % (app_label, model_name)))
  167. temp.append(url(r"^(\d+)/delete/", self.delete_view, name="%s_%s_delete" % (app_label, model_name)))
  168. temp.append(url(r"^(\d+)/change/", self.change_view, name="%s_%s_change" % (app_label, model_name)))
  169. temp.append(url(r"^$", self.list_view, name="%s_%s_list" % (app_label, model_name)))
  170. return temp
  171.  
  172. @property
  173. def urls_2(self):
  174. return self.get_urls_2(), None, None # [], None, None
  175.  
  176. class StarkSite(object):
  177. """site单例类"""
  178. def __init__(self):
  179. self._registry = {}
  180.  
  181. def register(self, model, stark_class=None, **options):
  182. """注册"""
  183. if not stark_class:
  184. # 如果注册的时候没有自定义配置类,执行
  185. stark_class = ModelStark # 配置类
  186.  
  187. # 将配置类对象加到_registry字典中,键为模型类
  188. self._registry[model] = stark_class(model, self) # _registry={'model':admin_class(model)}
  189.  
  190. def get_urls(self):
  191. """构造一层url"""
  192. temp = []
  193. for model, stark_class_obj in self._registry.items():
  194. # model:一个模型表
  195. # stark_class_obj:当前模型表相应的配置类对象
  196.  
  197. model_name = model._meta.model_name
  198. app_label = model._meta.app_label
  199.  
  200. # 分发增删改查
  201. temp.append(url(r"^%s/%s/" % (app_label, model_name), stark_class_obj.urls_2))
  202. """
  203. path('app01/userinfo/',UserConfig(Userinfo,site).urls2),
  204. path('app01/book/',ModelStark(Book,site).urls2),
  205. """
  206.  
  207. return temp
  208.  
  209. @property
  210. def urls(self):
  211. return self.get_urls(), None, None
  212.  
  213. site = StarkSite() # 单例对象

service/stark.py

stark——查看页面编辑删除按钮的更多相关文章

  1. selenium依次点击页面的删除按钮

    需要依次点击页面的删除按钮,如下图: @Test public static void FaBu() { TestMenuJump.jumpExam(driver); TestMenuJump.jum ...

  2. [App Store Connect帮助]二、 添加、编辑和删除用户(2)查看并编辑您的个人帐户

    您可以在 App Store Connect 的“编辑个人资料”中查看和编辑个人信息.如果您的 Apple ID 与多个帐户相关联,您可以在您的用户帐户之间切换. 查看您的个人帐户 在任意 App S ...

  3. ajax 实现加载页面、删除、查看详细信息,以及bootstrap网页的美化

      由于有些的程序员可能不是很会Photoshop,所以为了美化页面,我们可以借助工具bootstrap,实现起来相对就要比之前做的美观一些, 今天我用bootstrap把之前做的显示表格进行了一下美 ...

  4. GridView中的编辑和删除按钮,执行更新和删除代码之前的更新提示或删除提示

    在GridView中,可以通过设计界面GridViewr任务->编辑列->CommandField,很简单的添加的编辑和删除按钮 在前台源码中,可以看到GridView自动生成了两个列. ...

  5. 【HTML5】页面点击按钮添加一行 删除一行 全选 反选 全不选

    页面点击按钮添加一行    删除一行   全选   反选  全不选 页面效果图如下 html页面代码 <!DOCTYPE html> <html> <head> & ...

  6. el-table中操作一栏怎么根据当前行的信息显示编辑、删除、编辑完成按钮

    对每个按钮是否显示,使用v-show绑定变量,因为每一行的v-show绑定的变量必须是唯一的(不然的话操作此行,其他行的状态也会跟着变化),所以不可能提前在.ts中对变量进行初始化,只能使用本行的字段 ...

  7. Openstack web 添加和删除按钮

    注:当前已经时候用smaba将openstack环境的源码共享到windows系统上,并使用pycharm进行代码编辑和修改(参见openstack开发环境搭建).如下图:

  8. ABBYY FineReader 15 查看和编辑PDF

    使用ABBYY FineReader 15(Windows系统)OCR文字识别软件,用户可轻松查看和编辑各种类型的PDF数字文档,并可在文档中添加注释.添加与删除文字.格式化文字.搜索内容.保护PDF ...

  9. jquery easyui使用(四)······添加,编辑,删除

    前端: <div style="font-size: 25px; font-weight: 700; margin: 50px 0 10px 10px;"> 车辆登记 ...

随机推荐

  1. 华为敏捷DevOps实践:产品经理如何开好敏捷回顾会议

    大家好,我是华为云DevCloud项目管理服务的产品经理 恒少:) 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数.我希望借助 ...

  2. C++20草案中的宇宙飞船运算符(<=>,spaceship operator)

    C++20草案中的宇宙飞船运算符(<=>,spaceship operator) Herb Sutter提议的新三路运算符<=>已经被合入C++20草案中. 宇宙飞船运算符(h ...

  3. JsonToHtml

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 使用带参数的SQL语句向数据库中插入空值

    private void button1_Click(object sender, EventArgs e) { string name = textBox1.Text; int age = Conv ...

  5. 2.2、Softmax Regression算法实践

    Softmax Regression算法实践 有了上篇博客的理论知识,我们可以利用实现好的函数,来构建Softmax Regression分类器,在训练分类器的过程中,我们使用多分类数据作为训练数据: ...

  6. SprimgMVC学习笔记(十一)—— 解决静态资源无法被springmvc处理

    方法一:在springmvc.xml中配置 <!-- 解决静态资源无法被springMVC处理的问题 --> <mvc:default-servlet-handler /> 方 ...

  7. Android 应用资源及R文件的位置

    1.介绍 (1)常识 (2)在res目录下新建资源文件(例如数字资源) app--->res,选择res,右击new--->value resource file 2.字符资源(strin ...

  8. wzoi(栈模拟)

    链接:https://ac.nowcoder.com/acm/contest/332/I 来源:牛客网 题目描述 bleaves 最近在 wzoi 上面做题. wzoi 的题目有两种,一种是 noip ...

  9. HibernateUtil hibernate4.0以上

    package com.test.bbs.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import ...

  10. golang flag

    本文主要对golang环境下命令行的解析进行了相关的总结.命令行在C下有getopt等函数, 在golang下提供了更为方便的处理方法. 1.命令行参数获取:命令行获得可通过os.Args参数, Ar ...