可參考:http://www.runoob.com/django/django-admin-manage-tool.htmlhtml
https://code.ziqiangxuetang.com/django/django-tutorial.html前端
http://www.cnblogs.com/yuanchenqi/articles/6083427.htmlpython
pip install django --trusted-host mirrors.aliyun.comweb
pycharm無提示能夠setting-language&frameworks-python template language中選擇django正則表達式
建立項目django-admin startproject 項目名shell
建立應用 python manage.py startapp blog數據庫
在pycharm的工具欄找到 Tools,點擊以後會有「Run manage.py task」選項,點擊它以後,在pycharm下面會出現一個輸入界面,在裏面輸入「startapp appName(你的App名稱)」,回車以後就能夠在工程下面看到你新建的App了。django
Model class blog.models.Userinfo doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.報錯可能緣由是settings.py未設置後端
建立數據庫app
python manage.py makemigrations
python manage.py migrate
urls.py url與視圖函數映射
urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ] 可選的要傳遞給視圖函數的默認參數(字典形式) eg :傳入默認參數 urls.py urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.res,{'respone':'hello'}), ] views.py def res(req,respone): return HttpResponse(respone)
別名 (做用防止每次路徑修改前端都要改) urls.py urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.inde,name='ceshi') ] 前端html頁面直接用{%%}模板代替,注意,模板是後端解析的,前端無這用法 ceshi這個別名對應 login/ 若是你修改了urls 路徑未pay_login時,前端無需修改直接訪問ip:端口/pay_login/ <form action={%url "ceshi"%} method="post" enctype="multipart/form-data"> <p>姓名:<input type="text" name="user"></p> <p>密碼:<input type="password" name="passwd" ></p> <p>年齡:<input type="number" name="age"></p> </form>
urls實現路由分發
做用:一個項目裏可能有多個app,爲了分擔壓力,全局urls做爲路由分發 項目的urls.py from django.contrib import admin from django.urls import path,include #引入include urlpatterns = [ path('admin/', admin.site.urls), path('login/', include('blog.urls')) #全部login開頭的分發到blog.urls ] 在blog這個目錄裏咱們新建一個urls.py from django.contrib import admin from django.urls import path from blog import views urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.inde,name='ceshi'), path('test/',views.cur_time) ] 訪問時直接ip:端口/login/login和ip:端口/login/test訪問
templetes(存放H5頁面)
settings設置
<!DOCTYPE html> <html> <head> <title>Python</title> <link rel="icon" href="https://common.cnblogs.com/favicon.ico"/> <meta charset="utf-8"> </head> <body> <form action={%url "ceshi"%} method="post" enctype="multipart/form-data"> <p>姓名:<input type="text" name="user"></p> <p>密碼:<input type="password" name="passwd" ></p> <p>年齡:<input type="number" name="age"></p> <p>性別:男<input type="radio" name="sex" value="man"> 女<input type="radio" name="sex" value="women"></p> <!--單選框 name值相同才能互斥--> <p><input type="file" name="上傳" id="" ></p> <P><input type="reset" value="重置"></P> <p><input type="button" value="press"></p> <!--配合CSS做爲觸發器--> <p><input type="submit" value="提交" onclick="press()"></p> <h1>當前時間:{{recent_time|date:'Y-m-d H:i:s'}}</h1> </form> <hr> <h2>數據展現</h2> <table> <tr> <td>姓名</td> <td>密碼</td> <td>年齡</td> <td>性別</td> </tr> {%for i in user%} <tr> <td>{{user.username}}</td> <td>{{user.password}}</td> <td>{{user.age}}</td> <td>{{user.sex}}</td> </tr> {% endfor %} </table> </body> </html>
views.py(存放視圖函數)
from django.shortcuts import render,HttpResponse,redirect import datetime from blog import models from .apps import AppnameConfig #user_list=[] def inde(req): if req.method=="POST": username_f=req.POST.get("user",None) #匹配前端name若是無值返回None age_f=req.POST.get("age",None) password_f=req.POST.get("passwd",None) sex_f=req.POST.get("sex",None) print(req.POST) print ("%-5s %-10s %-10s %-10s" %(username_f,password_f,age_f,sex_f)) print("文件",req.FILES) # models.Userinfo.objects.create( # username=username_f, # age=age_f, # password=password_f, # sex=sex_f # ) # user_dict={'username': username, # 'password':password, # 'age': age, # 'sex': sex} # user_list.append(user_dict) for item in req.FILES: #文件上傳 obj=req.FILES.get(item) filename=obj.name with open(filename,'wb') as f: for line in obj.chunks(): f.write(line) curent_time = datetime.datetime.now() user_list=models.Userinfo.objects.all() return render(req, "login.html",{"recent_time":curent_time,"user":user_list}) #{}鍵值對先後映射後端 def cur_time(req): curent_time=datetime.datetime.now() return render(req,"login.html",{"recent_time":curent_time}) def res(req,respone): return redirect("www.baidu.com") #跳轉 def index(req): return render(req,"index.html",{"num":100})
templete與context(templete能夠複用)
模板語法
1.變量 {{變量名}}
2句點號 eg 上面html代碼
3過濾器filter 語法{{obj|filter:param}}
# 1 add : 給變量加上相應的值
# 2 addslashes : 給變量中的引號前加上斜線
# 3 capfirst : 首字母大寫
# 4 cut : 從字符串中移除指定的字符
# 5 date : 格式化日期字符串
# 6 default : 若是值是False,就替換成設置的默認值,不然就是用原本的值
# 7 default_if_none: 若是值是None,就替換成設置的默認值,不然就使用原本的值
標籤tag 使用 {%tag%}
{%if%}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>python</title> </head> <body> {% if num > 100 %} {% if num > 200 %} <p>num大於200</p> {% else %} <p>num大於100小於200</p> {% endif %} {% elif num < 100%} <p>num小於100</p> {% else %} <p>num等於100</p> {% endif %} </body> </html>
{%for%} 參考templete代碼
{%csrf_token%}:csrf_token標籤
用於生成csrf_token的標籤,用於防治跨站攻擊驗證。注意若是你在view的index裏用的是render_to_response方法,不會生效
其實,這裏是會生成一個input標籤,和其餘表單標籤一塊兒提交給後臺的。
<form action="{% url "bieming"%}" > <input type="text"> <input type="submit"value="提交"> {%csrf_token%} </form>
{% with %}:用更簡單的變量名替代複雜的變量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
{% verbatim %}: 禁止render渲染
{% verbatim %}
{{ hello }} #web直接展示{{hello}}
{% endverbatim %}
1在app中建立文件夾或者package 名字templatetags模塊(必須的,名字不能改)
2在templatetags下my_tags.py(任意 .py 文件)
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改變 @register.simple_tag #與filter調用方式不通{% my_add num %},不能用於IF語句 def my_add(nums): return nums+20 @register.filter #{參數不能超過2個 { num|my_add:2 }} def my_add(nums,num): return nums+num+20
html執行
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>python</title> </head> <body> {% load my_tags %} {# 導入自定義tag模塊 #} {% my_add num %} <hr> {{ num|my_add:2 }} </body> </html>
ursl.py
from django.contrib import admin from django.urls import path,include from blog import views urlpatterns = [ path('userinfo/',views.userinfo), path('age/',views.age), path('habbix/',views.habbix) ]
views.py
# Create your views here. from django.shortcuts import render,HttpResponse,redirect import datetime from blog import models from .apps import AppnameConfig def userinfo(req): return render(req,"user_info.html") def age(req): return render(req,'age.html') def habbix(req): return render(req,"habbix.html")
user_info.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <div class="page_header" style="height: 30px;background: chartreuse"><a href="/userinfo/">用戶信息</a></div> <div class="page_body" style="height:500px;background: saddlebrown"> <div class="memu" style="width: 30%;background: yellow;float: left;height: 500px"> <div><a href="/habbix/">愛好</a></div> <div><a href="/age/">年齡</a></div> </div> {# <div class="content" style="width: 70%;background: seashell;float: right;height: 500px">#} {# </div>#} {% block content %} {#模板,誰調用了模板本身填充block內容 #} {% endblock %} <div class="page_footer" style="height: 30px;background:#dc21be;clear: both">日期</div> </div> </body> </html>
habbix.html
{% extends "user_info.html" %} {# 導入模板 #} {% block content %} {# content標籤內容 #} <div class="content" style="width: 70%;background: seashell;float: right;height: 500px"> 愛好 </div> {% endblock %}
age.html
{% extends "user_info.html" %} {% block content %} <div class="content" style="width: 70%;background: seashell;float: right;height: 500px"> 年齡 </div> {% endblock %}