一、相关知识点回顾
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 importautodiscover_modulesclassStarkConfig(AppConfig):
name= 'stark' #应用名称
defready(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....classUserInfoConfig(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中写代码
classStarkSite(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 notstark_config_class:'''stark_config_class是类对象,如果没有这个类就重新赋值,去执行StarkConfig'''stark_config_class=StarkConfig
self._registry[model_class]=stark_config_class(model_class,self)#如果用户自己传进去类了,就用