Python 系列(19) django 路由和模板系统

Posted on Posted in python
文章目录[隐藏]
  1. # pip install django  
  2. django-admin startproject mydjango  
  3. cd mydjango/  
  4. django-admin startapp app01  
  5. python manage.py runserver 0.0.0.0:8000  
  6.   
  7. mydjango/  
  8. ├── app01 # 一个项目  
  9. │   ├── admin.py # 注册数据库  
  10. │   ├── apps.py # 不用管  
  11. │   ├── __init__.py  
  12. │   ├── migrations # 当数据库的表结构做修改,这里就会生成文件,原生sql的代码  
  13. │   │   └── __init__.py  
  14. │   ├── models.py # 数据库,创建表,字段之类  
  15. │   ├── tests.py # 作为测试,不用管  
  16. │   └── views.py # 逻辑实现  
  17. ├── db.sqlite3  
  18. ├── manage.py  
  19. └── mydjango  
  20.     ├── __init__.py  
  21.     ├── __init__.pyc  
  22.     ├── settings.py  
  23.     ├── settings.pyc  
  24.     ├── urls.py  
  25.     ├── urls.pyc  
  26.     ├── wsgi.py  
  27.     └── wsgi.pyc  

mydjango/settings.py 一般设置

  1. DEBUG = False  
  2. ALLOWED_HOSTS = ["*"]  

路由系统

mydjango/urls.py

  1. from django.conf.urls import url  
  2. from django.contrib import admin  
  3. from app01 import views # 导入app01的views  
  4.   
  5. urlpatterns = [  
  6.     url(r'^admin/', admin.site.urls),  
  7.     url(r'^index/', views.index), # http://192.168.1.250:8000/index/?hostname=name001&id=10  
  8.     url(r'^artlices/2018/', views.sprvisl_case_2018),  
  9.     url(r'^artlices/([1-2][0-9]{3})/([1-9]|1[0-2]{1})$', views.year), # 正则匹配年月,括号代表传入的参数,位置形参  
  10.     url(r'^host/(?P<hostname>\w+)/(?P<id>\w+)$', views.host), # 传值,类似字典的键 http://192.168.1.250:8000/host/name002/1234  
  11.     url(r'^.*', views.error), # 匹配一个全局error  
  12. ]  

app01/views.py

  1. from django.shortcuts import render, HttpResponse # 增加 HttpResponse  
  2.   
  3. # Create your views here.  
  4. def index(request):  
  5.     print request.method  
  6.     print request.GET  
  7.     print request.GET.get('hostname')  
  8.     return HttpResponse('<h1>index')  
  9.   
  10. def sprvisl_case_2018(request):  
  11.     return HttpResponse('<h1>2018')  
  12.   
  13. def year(request,year,month): # 这里传值是依次传值,与上面的url位置是一样的  
  14.     print(year,month)  
  15.     return HttpResponse('year:%s, month:%s' % (year,month))  
  16.   
  17. def error(request):  
  18.     return HttpResponse('<h1>Not Found')  
  19.   
  20. def host(request,id,hostname): # 这里的hostname和id 与上面的的url必须是一样的  
  21.     print('hostname',hostname)  
  22.     print('id',id)  
  23.     return HttpResponse('hostname : %s   id : %s' % (hostname,id))  

模版系统

  1. mydjango/  
  2. ├── app01  
  3. │?? ├── admin.py  
  4. │?? ├── apps.py  
  5. │?? ├── __init__.py  
  6. │?? ├── __init__.pyc  
  7. │?? ├── migrations  
  8. │?? │?? └── __init__.py  
  9. │?? ├── models.py  
  10. │?? ├── tests.py  
  11. │?? ├── views.py  
  12. │?? └── views.pyc  
  13. ├── db.sqlite3  
  14. ├── manage.py  
  15. ├── mydjango  
  16. │?? ├── __init__.py  
  17. │?? ├── __init__.pyc  
  18. │?? ├── settings.py  
  19. │?? ├── settings.pyc  
  20. │?? ├── urls.py  
  21. │?? ├── urls.pyc  
  22. │?? ├── wsgi.py  
  23. │?? └── wsgi.pyc  
  24. └── templates  

模版语法

mydjango/settings.py

  1. TEMPLATES = [  
  2.     {  
  3.         'BACKEND': 'django.template.backends.django.DjangoTemplates',  
  4.         'DIRS': [os.path.join(BASE_DIR, 'templates')],  
  5.         #'DIRS': [ BASE_DIR + "/templates"],  
  6.         'APP_DIRS': True,  
  7.         'OPTIONS': {  
  8.             'context_processors': [  
  9.                 'django.template.context_processors.debug',  
  10.                 'django.template.context_processors.request',  
  11.                 'django.contrib.auth.context_processors.auth',  
  12.                 'django.contrib.messages.context_processors.messages',  
  13.             ],  
  14.         },  
  15.     },  
  16. ]  

mydjango/urls.py

  1. from django.conf.urls import url    
  2. from django.contrib import admin    
  3. from app01 import views    
  4.     
  5. urlpatterns = [    
  6.     url(r'^admin/', admin.site.urls),    
  7.     url(r'^index/', views.index),  
  8.     url(r'register', views.register),    
  9. ]    

app01/views.py

  1. def index(request):  
  2.     # return render_to_response('index.html') 这是以前版本的写法  
  3.     # person = '<h1>my name django, age none'  
  4.     person = [{'name':'001', 'age':11}, # 对应下面的for循环  
  5.                 {'name':'002', 'age':12},  
  6.                 {'name':'003', 'age':13}]  
  7.     return render(request,'index.html', {'person':person}) #第一个参数默认request,第二个参数写模版的名字,第三个参数是传入的数据,类型是字典  
  8.   
  9. def register(request):  
  10.     if request.method == "POST":  
  11.         print(request.POST)  
  12.         username = request.POST.get('username')  
  13.         password = request.POST.get('password')  
  14.         print("username :%s, password:%s" %(username,password))  
  15.         return HttpResponse('ok')  
  16.     return render(request,'register.html')  

templates/index.html

  1. <html>  
  2. <head>  
  3. </head>  
  4.     <meta charset="UTF-8">  
  5.     <title>Index</title>  
  6. <body>  
  7. <h1>Index Page</h1>  
  8. <!-- safe 是过滤器,把person中的 h1 变为 html 代码 -->  
  9. <!-- upper/lower 转大小写 -->  
  10. {#{{ person | safe }} #} # 注释  
  11. <!-- 第二种 -->  
  12. {% for info in person %}  
  13.     {#{% if info.name == '001' %}#}  
  14.     {% if forloop.first %} <!-- 第一个 -->  
  15.         <div style="color:red">user : {{ info.name }} age : {{ info.age }}</div>  
  16.     {% elif info.name == '002' %}  
  17.         <div style="color:green">user : {{ info.name }} age : {{ info.age }}</div>  
  18.     {% else %}  
  19.         <div style="color:blue">user : {{ info.name }} age : {{ info.age }}</div>  
  20.     {% endif %}  
  21. {% endfor %}  
  22. <!-- 第三种 隔行变色-->  
  23. {% for info in person %}  
  24.         {% if forloop.counter|divisibleby:'2' %} # divisibleby 除以2取余  
  25.                 <div style="color:aqua">user:{{ info.name }} age:{{ info.age }}</div>  
  26.         {% else %}  
  27.                 <div style="color:pink">user:{{ info.name }} age:{{ info.age }}</div>  
  28.         {% endif %}  
  29. {% endfor%}  
  30. </body>  
  31. </html>  

templates/register.html

  1. <html>  
  2. <head>  
  3.     <meta charset="UTF-8">  
  4.     <title>register</title>  
  5. </head>  
  6.   
  7. <body>  
  8. <form action="" method="post">{% csrf_token %} # 防止跨站  
  9.     username: <input type="text" name="username"><br />  
  10.     password: <input type="password" name="password"><br />  
  11.     <input type="submit" value="注册">  
  12. </form>  
  13. </body>  
  14. </html>  

模版继承

templates/say.html

  1. <html>  
  2. <head>  
  3.     <meta charset="UTF-8">  
  4.     <title>register</title>  
  5. </head>  
  6.   
  7. <body>  
  8. <h1>say page</h1>  
  9. </body>  
  10. </html>  

cat templates/hello.html

  1. <html>  
  2. <head>  
  3.     <meta charset="UTF-8">  
  4.     <title>register</title>  
  5. </head>  
  6.   
  7. <body>  
  8. <h1>hello page</h1>  
  9. </body>  
  10. </html>  

templates/index.html

  1. <html>  
  2. <head>  
  3. </head>  
  4.     <meta charset="UTF-8">  
  5.     <title>Index</title>  
  6. <body>  
  7. <h1>Index Page</h1>  
  8. {% block rewrite %} {# block 用于别的页面重写#}  
  9. {% for info in person %}  
  10.     {% if forloop.counter|divisibleby:'2' %}  
  11.         <div style="color:aqua">user:{{ info.name }} age:{{ info.age }}</div>  
  12.     {% else %}  
  13.         <div style="color:pink">user:{{ info.name }} age:{{ info.age }}</div>  
  14.     {% endif %}  
  15. {% endfor%}  
  16. {% endblock %}  
  17.   
  18. {% include 'say.html' %} {# 可以出现很多次,多次引用 #}  
  19. {% include 'hello.html' %}  
  20. </body>  
  21. </html>  

templates/test.html

  1. {% extends 'index.html' %} {# 只能引用一次 #}  
  2. {% block rewrite %}  
  3. 重写的内容,覆盖index.html里的block  
  4. {% endblock %}  

app01/views.py

  1. def test(request):  
  2.     return render(request, 'test.html')  

mydjango/urls.py

  1. url(r'test', views.test),  

Leave a Reply

Your email address will not be published. Required fields are marked *

one + 7 =