目錄css
用戶可以訪問的全部的資源,都是程序猿提早暴露的,若是沒有暴露,用戶是不能進行訪問的。html
,當咱們更改django中的代碼的時候,django內部會檢測到咱們更改,因此會重啓。django是能夠自動重啓的 可是有時候反應速度比較慢,也有可能在你代碼沒寫完的時候重啓了 會報錯 可是不用管,修改完畢後,能夠本身進行啓動。前端
from django.shortcuts import render,HttpResponse,redirect HttpResponse # 返回字符串 render # 返回html頁面 而且能夠給該html傳值 redirect # 重定向 # 既能夠是咱們本身的路徑也能夠是網上的路徑 django返回的都是HttpResponse對象
def player(request): res = HttpResponse('dfdf') print(res) return res from django.template import Template,Context def test(request): #能夠直接解析html return HttpResponse("<h1>哈嘍</h1>") # res = Template("<h1>{{user}}</h1>") # con = Context({"user":"json",'pwd':123}) # ret = res.render(con) # print(ret) # return HttpResponse(ret)
def sing(request): res = redirect('/login') print(res) return res
def dance(request): res = render(request, 'cuang.html') print(res) return res 能夠加入參數:參數會返回cuang.html頁面中,進行渲染頁面 def reg(request): user_dict = {'name':'jason','pwd':123} # return render(request,'reg.html') # 給模板傳值的方式1 # return render(request, 'reg.html',{'xxx':user_dict}) # 將user_dict傳遞給reg.html頁面 頁面上經過xxx就可以獲取到該字典 # 給模板傳值的方式2 return render(request,'reg.html',locals()) # 會將當前名稱空間中全部的變量名所有傳遞給reg.html頁面 # locals() 會出現效率問題
2.靜態文件配置 靜態文件 網站所用到的 本身寫好js 本身寫好css 第三方的框架 bootstrap fontwesome sweetalert,elementui,layui 一般狀況下 網站所用到的靜態文件資源 統一都放在static文件夾下 STATIC_URL = '/static/' # 是訪問靜態資源的接口前綴 """只要你想訪問靜態資源 你就必須以static開頭""" # 手動配置靜態文件訪問資源 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), os.path.join(BASE_DIR,'static1'), # os.path.join(BASE_DIR,'static2'), ] html中 接口前綴 動態解析,這樣能夠修改STATIC_URL,在html中依舊能夠檢測到css,js {% load static %} <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
orm對象關係映射 類 數據庫的表 對象 表的記錄 對象獲取屬性 記錄的某個字段對應的值
可以讓一個不會數據庫操做的人 也可以簡單快捷去使用數據庫
python
有時候 結合項目需求 可能須要你手寫sql語句jquery
1.django的orm不會自動幫你建立庫,庫須要你本身手動建立
表會自動幫你建立 你只須要書寫符合django orm語法的代碼便可git
去應用下所在的models.py中書寫類 from django.db import models # Create your models here. class Userinfo(models.Model): # 設置id字段爲userinfo表的主鍵 id int primary key auto_increment id = models.AutoField(primary_key=True) # 在django中 你能夠不指定主鍵字段 django orm會自動給你當前表新建一個名爲id的主鍵字段 # 設置username字段 username varchar(64) CharField必需要指定max_length參數 username = models.CharField(max_length=64) # 在django orm中 沒有char字段 可是django 暴露給用戶 能夠自定義char字段 # 設置password字段 password int password = models.IntegerField()
******************************數據庫遷移(同步)命令*********************************** python manage.py makemigrations # 不會建立表 僅僅是生成一個記錄 將你當前的操做記錄到一個小本本上(migrations文件夾) python manage.py migrate # 將你的orm語句真正的遷移到(同步)到數據庫中 只要你在models.py中修改了跟數據庫相關的代碼 你就必須從新開始執行上面兩條命令
前期你若是要提交post請求 你就去settings.py文件註釋掉一箇中間件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
先後端數據交互 如何獲取請求方式 獲取post請求攜帶的數據 request.POST 獲取get請求攜帶的數據 request.GET get和post在後端獲取用戶數據的時候 規律是同樣的 request.GET # 你就把它當成一個大字典 裏面放的是get請求攜帶過來的數據 request.POST # 你就把它當成一個大字典 裏面放的是post請求攜帶過來的數據 """上面的大字典 全部的value都是一個列表""" request.GET.get('key') # 默認取的是列表的最後一個元素 並非直接將列表取出 request.GET.getlist('key') # 直接將value的列表取出 request.POST.get('key') # 默認取的是列表的最後一個元素 並非直接將列表取出 request.POST.getlist('key') # 直接將value的列表取出 如: <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}> tank <class 'str'> 123 <class 'str'> request.POST.get('username') 默認只取列列表的最後一個元素 若是你想將列表完整的取出 你必須用getlist()
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) # 總共八位 小數佔兩位 price = models.DecimalField(max_digits=8,decimal_places=2) # 書和出版社是一對多的關係 外鍵字段鍵在多的一方 publish_id = models.ForeignKey(to='Publish') # to指定跟誰是外鍵關聯的 默認關聯的是表的主鍵字段 """ ForeignKey字段 django orm在建立表的時候 會自動給該字段添加_id後綴 """ # 書和做者是多對多的關係 外鍵字段建在任何一方均可以 可是 推薦你建在查詢頻率比較高的一方 authors = models.ManyToManyField(to='Author') """authors字段僅僅是一個虛擬字段 不會再表中展現出來 僅僅是用來告訴django orm 書籍表和做者表示多對多的關係 自動建立第三張表 """ class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=255) class Author(models.Model): name = models.CharField(max_length=32) phone = models.BigIntegerField() # 一對一字段 建在哪張表均可以 可是推薦你建在 查詢頻率比較高的那張表 author_detail = models.OneToOneField(to='AuthorDetail') """ OneToOneField字段 django orm在建立表的時候 會自動給該字段添加_id後綴 """ class AuthorDetail(models.Model): addr = models.CharField(max_length=255) age = models.IntegerField()
表字段的增刪改查
新增的字段
1.直接提供默認值 default
2.設置改字段能夠爲空 null=True
注意的是 不要輕易的註釋models.py中任何跟數據庫相關的代碼
主要是跟數據庫相關的代碼 你在處理的時候必定要當心謹慎sql
class Userinfo(models.Model): # 設置id字段爲userinfo表的主鍵 id int primary key auto_increment id = models.AutoField(primary_key=True) # 在django中 你能夠不指定主鍵字段 django orm會自動給你當前表新建一個名爲id的主鍵字段 # 設置username字段 username varchar(64) CharField必需要指i定max_length參數 username = models.CharField(max_length=32) # 在django orm中 沒有char字段 可是django 暴露給用戶 能夠自定義char字段 # 設置password字段 password int password = models.IntegerField() # phone = models.BigIntegerField(default=110) # 新增的字段 能夠提早設置默認值 # addr = models.CharField(max_length=64,null=True) # 新增的字段 能夠設置爲空 def __str__(self): return '我是用戶對象:%s'%self.username
get()數據庫
條件不存在的狀況下 會直接報錯 因此不推薦你使用get方法查詢數據django
filter()json
def login(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get("password") # 先以用戶名爲依據查詢數據 # 1.get() 當查詢條件不存在的時候 會直接報錯 若是存在會直接給你返回 數據對象自己 不推薦使用 # res = models.Userinfo.objects.get(username=username) # select id,username,password from userinfo where username='jason' # print(res) # print(res.username) # print(res.password) # 2.filter() 當查詢條件不存在的時候 不會報錯而是返回一個空 # 當條件存在的狀況下 不管數據有幾條返回的都是列表套對象的數據格式 # filter能夠當多個查詢條件 而且是and關係 res = models.Userinfo.objects.filter(username=username) # select * from userinfo where username='jason' and password=123; # user_obj = res[0] # user_obj = res[0:3] # user_obj = res[-1] # 你能夠將filter查詢出來的結果當作列表去對待 支持正數的索引取值和切片 不支持負數 user_obj = res.first() # 取queryset第一個元素 print(user_obj) return render(request,'login.html')
create()
括號內些關鍵字參數的形式 建立數據
該方法會有一個返回值 返回值就是當前對象自己
利用對象點方法的方式
user_obj = User(username='jason')
user_obj.save() # 將當前對象保存到數據庫中
def reg(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get("password") # 直接將用戶名和密碼寫入數據庫 # 方式1 # user_obj = models.Userinfo.objects.create(username=username,password=password) # insert into userinfo(username,password) values('admin','666'); # create方法會有一個返回值 返回值就是當前被建立的數據對象 # 方式2 user_obj = models.Userinfo(username=username,password=password) user_obj.save() print(user_obj) return render(request,'register.html')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h2 class="text-center">編輯頁面</h2> <form action="" method="post"> username:<input type="text" class="form-control" name="username" value="{{ edit_obj.username }}"> password:<input type="text" class="form-control" name="password" value="{{ edit_obj.password }}"> <br> <input type="submit" class="btn btn-warning"> </form> </div> </div> </div> </body> </html>
def edit_user(request): # 1.如何獲取用戶想要編輯的數據 edit_id = request.GET.get('edit_id') if request.method == 'POST': # 將用戶新修改的全部的數據 username = request.POST.get("username") password = request.POST.get("password") """POST中也是能夠獲取GET請求攜帶的參數""" # 去數據庫中修改對應的數據 # 方式1: models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password) # 批量更新 # 方式2: 獲取當前數據對象 而後利用對象點屬性的方式 先修改數據 而後調用對象方法保存 # 不推薦你使用第二種方式 效率低 挨個從新寫入一遍 # edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk可以自動幫你查詢出當前表的主鍵字段名 # edit_obj.username = username # edit_obj.password = password # edit_obj.save() """update方法會將filter查詢出來的queryset對象中全部的數據對象所有更新""" # 跳轉到數據展現頁面 return redirect('/userlist') # 2.根據主鍵值去數據庫中查詢出當前對象 展現給用戶看 edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk可以自動幫你查詢出當前表的主鍵字段名 # 3.將查詢出來的數據對象傳遞給前端頁面 展現給用戶看 return render(request,'edit_user.html',locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> {% load static %} <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-center">數據展現</h1> <table class="table table-hover table-striped table-bordered"> <thead> <tr > <th>主鍵值</th> <th>用戶名</th> <th>密碼</th> <th class="text-center">操做</th> </tr> </thead> <tbody> {% for user_obj in user_queryset %} <tr> <td>{{ user_obj.id }}</td> <td>{{ user_obj.username }}</td> <td>{{ user_obj.password }}</td> <td class="text-center"> <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-sm">編輯</a> <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-danger btn-sm">刪除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
def delete_user(request): # 獲取想要刪除的數據id 直接刪除 delete_id = request.GET.get('delete_id') models.Userinfo.objects.filter(pk=delete_id).delete() # 批量刪除 return redirect('/userlist')