一、相关知识点回顾
1、什么是反射?
可以用字符串的方式去访问对象的属性
2、反射有四种方法?
hasattr(object,name):判断一个对象是不是有name属性或者方法
getattr:获取对象的属性或者方法, 需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址, 如果需要运行这个方法,可以在后面添加一对()
setattr:给对象的属性赋值,如果属性不存在,先创建后赋值
delattr:删除该对象指定的一个属性
3、创建ModelForm的两种方式
# 方式一定义ModelForm class TestModelForm(ModelForm): class Meta: model = self.model_class fields = "__all__" 方式二定义 Meta = type("Meta", (object,), {"model": self.model_class, "fields": "__all__"}) TestModelForm = type("TestModelForm", (ModelForm,), {"Meta": Meta})
二、具体流程以及相关知识点
1、路由系统
让url对应视图,这时的视图可以是一个元组,元组的里面放三个参数,第一个是个列表,这两种表示方式都是一样的,用那种都行
namespace的用法如下
v => ([],None,None) namespace(是第三个参数),用于区分相同name的url,通过namespace为url添加一个前缀
如图:
namespace
流程:
首先创建三个应用
app01
app02
strak
1、一旦运行的时候都会去执行admin.py ,现在我们让你开始执行stark.py 文件,加上下面的这些(参考的是admin的源码,在每一个admin文件的里面点击进入)
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig): name = 'stark' #应用名称 def ready(self): autodiscover_modules('stark') #在应用中创建的py文件和这个名字一样
切记一定要在sessings中配置一下:
'app02.apps.App02Config', 'stark.apps.StarkConfig',
2、然后再每个应用下面也创建一个stark.py的文件
这样就像admin一样了,就开始执行site.redister了
3、这时候还没有site呢,需要自己实例化一个site
在应用下创建一个service的文件夹,再创建一个v1.py文件,在里面写代码
4、在stark里面注册
需要注意的是:
v1.site.register(models.UserInfo) -> 执行 StackConfig的 changelist_view方法/add_view.... class UserInfoConfig(v1.StarkConfig): def changelist_view(self,request,*args,**kwargs): return HttpResponse('你猜我是谁?') v1.site.register(models.UserInfo,UserInfoConfig) ---> 优先查看自己config中是否存在方法,不存在则执行基类 StackConfig的 changelist_view方法/add_view....
如图:
5、注册完成之后走urls。仿照admin的urls.。。。v1.site.urls
6、完了在v1.py中写代码
class StarkSite(object): def __init__(self): self._registry ={} #放置处理请求对应关系 ''' _registry = { models.Role: StarkConfig(models.Role,v1.site), models.UserInfo: StarkConfig(models.UserInfo,v1.site) models.UserType: StarkConfig(models.UserType,v1.site) models.Article: StarkConfig(models.Article,v1.site) } ''' def register(self,model_class,stark_config_class=None): if not stark_config_class: '''stark_config_class是类对象,如果没有这个类就重新赋值,去执行StarkConfig''' stark_config_class = StarkConfig self._registry[model_class] = stark_config_class(model_class,self) #如果用户自己传进去类了,就用自己的,自己的需要继承StarkConfig。如果自己没有就找基类的,自己有就用自己的 def get_urls(self): url_list = [] for model_calss,stark_config_obj in self._registry.items(): app_name = model_calss._meta.app_label#应用名称 model_name = model_calss._meta.model_name#表的名称 cur_url = url(r'^{0}/{1}/'.format(app_name,model_name),(stark_config_obj.urls,None,None)) #这是的stark_config_obj是上面StarkConfig的实例对象。stark_config_obj.urls就会去找上面类的urls url_list.append(cur_url) return url_list @property #吧方法当属性来用 def urls(self): return (self.get_urls(),None,'stark') #第三个参数是namesapce
动态生成类名和应用名图示:
在v1里面有两个类
- StarkConfig,用于为每一个类生成URL对应关系,并编写视图函数处理用户请求。 [ ^$ -> self.changelist_view ^add/$ -> self.add_view ^dele