Django 2 零基础 - 待办清单网站
根據(jù)b站視頻https://www.bilibili.com/video/BV1bW411N7xN?p=8整理的
不清楚可以去看視頻喲
1前期準(zhǔn)備
成功顯示如下
2準(zhǔn)備app
- 激活虛擬環(huán)境
- 一個app負(fù)責(zé)一種功能 創(chuàng)建一個 todolist App 負(fù)責(zé)實現(xiàn) 待辦事項 功能
將to_do_list整個拖到文本編輯器
- 注冊該app,告訴服務(wù)器我存在
- 在這個app里面做個html網(wǎng)頁,放在templates(網(wǎng)頁模板)文件夾中
!tab
h1 tab 會自動生成
右鍵 open in browser 選default 選擇其他可能會出現(xiàn)找不到文件chrome
3配置url和view
- 設(shè)置好網(wǎng)址, 給這個頁面起個什么網(wǎng)址
- 當(dāng)用戶通過這個網(wǎng)址發(fā)出請求時,將網(wǎng)頁發(fā)送給他
- 因為這個網(wǎng)頁是待辦事項網(wǎng)頁, 網(wǎng)址設(shè)置和用戶請求都讓 todolist APP處理
這里django可能下滑波浪線 可以在settings把環(huán)境選在scripts下 因為剛開始裝的時候是吧django裝在scripts下
4.bootstrap導(dǎo)航欄
https://v4.bootcss.com/docs/4.0/examples/ 找到Navbar static 復(fù)制源代碼
替換cdn
5.bootstrap表格
https://v4.bootcss.com/docs/4.0/content/tables/
6.bootstrap表單
https://v4.bootcss.com/docs/components/forms/
7.網(wǎng)址名,網(wǎng)頁名
關(guān)于include()
大項目 -> 要避免網(wǎng)址名 網(wǎng)頁名沖突
render() 如何找到網(wǎng)頁 ?
根據(jù)所提供的網(wǎng)頁名稱,找所有的templates的文件夾,取第一個匹配的
網(wǎng)頁名字重復(fù)怎么辦?
給個前綴
建個新文件夾在templates下,以 app的名字 命名
想改網(wǎng)址怎么辦?要改的地方好多o(╥﹏╥)o
給網(wǎng)址起名字
網(wǎng)址名跟其他app里面的網(wǎng)址名字重復(fù)怎么辦?
給個前綴
8 模版繼承
我想改變導(dǎo)航欄的樣式怎么辦? 3個網(wǎng)頁都要改?
Template inheritance
做個模板html(所有網(wǎng)頁的風(fēng)格主題), 其他網(wǎng)頁繼承它,拓展它, 類似python的類繼承
extends
到main之前的 和之后的粘貼下來 做成base.html
9.靜態(tài)文件
新建static文件夾,存放 圖片 css javascript
里面,再新建一個app文件夾,避免與其他app的static文件夾里面的靜態(tài)文件沖突
10.處理用戶請求
request GET HTML form -> action="" method="POST" button->submit {% csrf_token %} 跨站請求偽造 name="" 給input的起名字 request.POST是什么? QueryDict content dictionary 在html中通過var訪問字典 {{ var }} 變量{{ }} 和標(biāo)簽{% %} post是發(fā)送請求 action='' 表發(fā)送到自己的服務(wù)器11.增刪改查
刷新后會出現(xiàn)如圖錯誤 因為我們定義的是post 而刷新方法是get
所以 要承擔(dān)用戶的post和get請求
增刪改查 用字典存儲, 只要服務(wù)器開著…
如果是get請求怎么辦? 比如刷新 判斷request.method 如果是get 只要將原來頁面返回給他即可
如果是get請求怎么辦? request.POST 中不存在’待辦事項’這個鍵
如果是post請求, 但用戶不寫內(nèi)容怎么辦? request.POST 中的’待辦事項’這個鍵對應(yīng)值為 空的字符串 ‘’
用GET方法刪除,劃掉真的對嗎? 用隱藏的form
全局列表
重點在于 查找路徑todo/ del/<forloop_counter> 當(dāng)你刪除序號的待辦事項 是todo/ del/2
12.bootstrap彈窗
https://v4.bootcss.com/docs/4.0/components/alerts/
<div class="alert alert-warning alert-dismissible fade show" role="alert"><strong>Holy guacamole!</strong> You should check in on some of those fields below.<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button> </div>js
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>Modal https://v4.bootcss.com/docs/4.0/components/modal/
13.數(shù)據(jù)庫
數(shù)據(jù)庫,建標(biāo)
CREATE TABLE 待辦事項表 (序號 INT NOT NULL AUTO_INCREMENT,待辦事項 VARCHAR(100) NOT NULL,已完成 tinyint(1) NOT NULL DEFAULT 0,PRIMARY KEY (序號) )ENGINE=InnoDB CHARSET=utf8; 增加數(shù)據(jù) INSERT INTO 待辦事項表 (待辦事項) VALUES ('看電影'); INSERT INTO 待辦事項表 (待辦事項) VALUES ('逛街'); INSERT INTO 待辦事項表 (待辦事項) VALUES ('陪客戶吃飯'); 建表 和 增刪改查 django都能幫我們搞定 設(shè)置數(shù)據(jù)庫連接 DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),} }create Model
創(chuàng)建Model類,用來描述表的構(gòu)成: 有哪些列(待辦事項,完成狀態(tài),序號…)
這是給網(wǎng)站開發(fā)者看的
—————————————————————————————————————————————
登錄注冊
思路
1auth.urls
from django.contrib import admin from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('', include('myauth.urls')), ]2 myauth.urls
from django.urls import path,include from . import views app_name='myauth' urlpatterns = [path('',views.主頁,name='主頁'),path('login/',views.登錄,name='登錄'), ]3 views.py
def 主頁(請求):return render(請求,'myauth/home.html')4 html
創(chuàng)建超級管理員
python manage.py createsuperuser
python manage.py runserver 開啟服務(wù)器
在model中建表 建注冊的新要求
from django.db import models from django.contrib.auth.models import User# Create your models here.class 普通會員表(models.Model):用戶=models.OneToOneField(User,on_delete=models.CASCADE)昵稱=models.CharField(blank=True,max_length=50)生日=models.DateField(blank=True,null=True)#生日可以為空 修改model后要重新建立遷移文件class Meta:verbose_name_plural="普通會員表s"之后在cmd輸入以下兩句 真正的建表
python manage.py makemigrations python manage.py migrate在admin.py
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from .models import 普通會員表class 普通會員表Inline(admin.TabularInline):#兩張表一起顯示 表格顯示法 一對一model= 普通會員表can_delete = Falseverbose_name_plural = '普通會員表'class UserAdmin(BaseUserAdmin):inlines = (普通會員表Inline,)admin.site.unregister(User) admin.site.register(User,UserAdmin) #重新注冊 前者注冊model這個表 后者注冊配置文件新建forms.py
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django import forms #創(chuàng)建一個表單給用戶填寫 之前的UserCreationForm是django幫我們寫的 所以現(xiàn)在新建的繼承UserCreationFormclass 自定義注冊表單(UserCreationForm):昵稱 = forms.CharField(required=False, max_length=50)#required=False昵稱不一定寫生日 = forms.DateField(required=False)class Meta:model=User #自定義注冊表屬于普通會員表 而其又屬于User(UserCreationFor創(chuàng)建產(chǎn)生的fields=('username','password1','password2','email','昵稱','生日')#指定非超級用戶(管理員)什么地方可以編輯什么地方不可以之后再views.py 導(dǎo)入
from .forms import 自定義注冊表單將UserCreationForm替換成自定義注冊表單
若不滿意django自帶的錯誤提示 可以用if else 自己寫
或者自定義錯誤 但是一般比較麻煩的是不知道對應(yīng)的鍵值 所以輸入as.json
這樣就知道鍵值是 invalid
可以在def 中修改invalid的值
建立個人中心
現(xiàn)有網(wǎng)址再有網(wǎng)頁再有函數(shù)
urls.py
views.py
from django.contrib.auth.decorators import login_required@login_required(login_url="myauth:登錄") #一定要登錄 沒登錄的話跳到登錄頁面 def 個人中心(請求):return render(請求,'myauth/user_center.html')@login_required(login_url="myauth:登錄") def 編輯個人信息(請求):if 請求.method == 'POST':#編輯成功到中心return redirect(請求,'myauth/user_center.html')else:#get 是想編輯return render(請求, 'myauth/edit_profile.html')@login_required(login_url="myauth:登錄") def 修改密碼(請求):if 請求.method == 'POST': # 編輯成功到中心return redirect(請求, 'myauth/user_center.html')else: # get 是想編輯return render(請求, 'myauth/change_password.html')待更新…
總結(jié)
以上是生活随笔為你收集整理的Django 2 零基础 - 待办清单网站的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 210511阶段四 切片 迭代 生成器
- 下一篇: 2019蓝桥杯省赛b组