django學習教程(二)models 模型相關
版本:django2.0
開啟APP下models.py檔案
model基本建立
假設我們目前在做網站的使用者註冊模組。
我們希望這個使用者擁有如下資訊
- 使用者名稱
- 密碼
- 聯絡方式
- 郵箱
class User(models.Model): username = models.CharField(max_length = 50) password = models.CharField(max_length = 200) tel = models.CharField(max_length = 50,default='') email = models.EmailField() def __str__(self): return self.username
註冊模型並同步資料庫
在命令列進入manage.py同級目錄
依次輸入以下指令
python manage.py makemigrations
python manage.py migrate
這時開啟資料庫視覺化工具,我們便可以看到我們在該資料庫下新建了一個使用者表。
後臺新增資料庫內容
(連線資料庫通過SQL語句新增內容這種方法暫且不談)
開啟APP下的views.py檔案
新建一個方法
from log.models import User #這裡的log改成你的APP名稱 def index(request): user = User() user.username="sd" user.password="a" user.tel="123" user.email="1" user.save() return render(request,'index.html')
通過user=User()在使用者表中建立一個新欄,然後加入內容,最後user.save()儲存。
model常用型別
models型別 | 名稱 | 介紹 |
---|---|---|
models.AutoField | 自增列 | 預設會生成一個名稱為 id 的列 |
models.CharField | 字串欄位 | 必須有max_length 引數 |
models.BooleanField | 布林型別 | 不能為空 |
models.DateField | 日期型別 | |
models.DateTimeField | 日期型別 | 同DateField的引數 ,多了時間 |
models.EmailField | 郵箱列 | 字串型別(正則表示式郵箱) |
models.FloatField | 浮點型別 | =double |
models.IntegerField | 整形 | |
models.BigIntegerField | 長整形 | |
models.TextField | 文字型別 | 字串=longtext |
models.ImageField | 圖片型別 | |
models.FileField | 檔案型別 |
當使用了圖片型別或檔案型別時,modes.py下
img = models.ImageField(upload_to='xxx')
這代表著將圖片提交到xxx資料夾下。
models查詢方法
- filter
result = User.objects.filter(username = "xxx")
從User表中查詢username="xxx"的記錄,返回的是一個列表。(可以為空)
- get
result = User.objects.get(username = "xxx")
從User表中查詢username="xxx"的記錄。
注意:User表中必須有且只有一條符合條件的username記錄,否則報錯
- 欄位排序
results = User.objects.all().order_by('age')
- 模糊查詢(同樣用到的是filter)
1、包含 contains
例:查詢姓名包含'xiao'的學生。
Student.objects.filter(name__contains='xiao')
2、開頭:startswith 結尾:endswith
例:查詢姓名以'xiao'開頭的學生 以'ming'結尾的學生
Student.objects.filter(name__startswith='xiao')
Student.objects.filter(name__endswith='ming')
3、 範圍查詢 in
例:查詢年齡12或15或16的學生
Student.objects.filter(age__in=[12,15,16])
4. 比較查詢 gt lt(less than) gte(equal) lte
例:查詢年齡大於等於12的學生
Student.objects.filter(age__gte=12)
5、 日期查詢 date
例:查詢1994年出生的學生。
Student.objects.filter(birthyear__date=1994)
例:查詢1994年1月1日後出生的學生。
Student.objects.filter(birthyear__date__gt = date(1994,1,1))
6、 返回不滿足條件的資料 exclude
例:查詢id不為3的學生。
Student.objects.exclude(id=3)
通過前臺提交內容到資料庫
【在templates資料夾下新建一個html檔案,並通過urls註冊路由】
通過前臺提交內容就需要用到form表格。
而這就不得不提到csrf_token驗證【django預設開啟】
(一)在csrf_token開啟情況下
前臺的form標籤需要如下書寫。
<form method="POST">
{% csrf_token %}
<p>username: <input type="text" name="teacher_id"></p>
<p>password:<input type="password" name="password"><p>
<input type="submit" value="login">
</form>
不新增 {% csrf_token %}就會提交出錯。
(二)關閉csrf_token驗證
開啟settings.py檔案,將這句話註釋。
前臺表單提交(以使用者註冊模組為例)
假設使用者需要註冊資訊,那麼它在前臺填寫了下面表單後,就應該把資訊新增到資料庫中
方法一 通過django自帶表單功能
在App下新建一個forms.py檔案
from django import forms
class UserInfo(forms.Form): #定義的django表單
username = forms.CharField()
password = forms.CharField()
在views.py檔案下
def index(request):
userform=UserInfo()
if request.method=="POST":
userform= UserInfo(request.POST)
if userform.is_valid():
username = userform.cleaned_data['username']
password = userform.cleaned_data['password']
user=User()
user.username=username
user.password=password
user.save()
return render(request,'index.html')
在index.html檔案下
<form type="POST">
{{userform.username}}
{{userform.password}}
<button type="submit">提交</button>
</form>
這種方式比較簡便,但是佈局比較醜陋。
方法二 通過POST方法接收【推薦】
views.py檔案
def index(request):
if request.method=="POST":
user = User()
user.username = request.POST.get('username','')
user.password = request.POST.get('password','')
user.save()
return render(request,'index.html')
index.html檔案
<form type="POST">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">提交</button>
</form>
通過這種方式我們便可以很容易更改input輸入框的style。