跟着视频敲了两个星期了,感觉很多地方都是似懂非懂,django搭建出来的项目到底是怎么运行的?数据是怎么流通的?
1.一开始以为django是基于MVC的三层架构,大体运行思路应该是:
2.Model,Control,View分别对应django中的什么?
django是基于app开发的,在新建一个app后,系统自动生成了很多文件,其中就有:model和View:
新建app:点击工具栏Tool->Run manage.py Task,输入startapp +app的名称(我这里叫firstapp),最后回车
在工程目录下,就会出现firstapp文件,展开后可以看到以下文件:
model.py对应Model层,view.py对应View层.....那Control层谁对应呢?
百思不得其解,最后上网百度了一下,原来django是基于MTV的。
即:Model,Template,View。
Model:对象和数据库的关系映射(ORM),model.py中数据库一张表对应一个class
Template:存放html页面,负责数据展示。
View:负责业务逻辑。
那么,整个数据的业务流程应该是如下这样的:
3.我输入网址后,view.py中的类是怎么和网址中的地址关联起来的?
如:输入http://127.0.0.1:8000/TestView/是如何找到view中的TestView(View)类
class TestView(View):
def get(self,request):
return render(request,'Test.html')
答案是通过urls.py中的url设置来实现网址和view类的关联,urls.py中保存了url与view的映射。
如下图中 url(r'^TestView/', TestView.as_view()),第一个参数是一个正则表达式,即匹配网址中含有TestView/的网址,第二个参数就是view中的类调用as_view()方法。
那么现在的流程图应该是:
4.现在已经可以找到view,那么view是怎么把数据传给Template,同样Template又是如何把数据传个view的?
1)Template通过request请求来向view传递数据。
<form id="email_register_form" method="post" action="{% url 'testView' %}" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ' />
<label>邮 箱</label>
<input type="text" id="id_email" name="email" value="{{ TestForm.email.value }}" placeholder="请输入您的邮箱地址" />
<label>密 码</label>
<input type="password" id="id_password" name="password" value="{{ TestForm.password.value }}" placeholder="请输入6-20位非中文字符密码" />
<input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " />
<div class="error btns" id="jsEmailTips">{% for key,error in TestForm.errors.items %}{{ error }}{% endfor %}</div>
{% csrf_token %}
</form>
form通过method属性指明post方法接收,action通过url的name指明哪个url进行分发。
class TestView(View):
def get(self,request):
return render(request,'Test.html')
def post(self,request):
email=request.POST.get('email')
print(email)
request.POST.get('email'),get()方法参数为input标签的name属性值
2)view怎么把数据传回html页面?
通过render()
return render(request, 'Test.html',{'msg' :'hello world'})
在Test.html中任意地方使用
{{ msg}}
就可以显示hello world。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>{{ msg}}</p>
</body>
</html>
现在流程图应该是: