日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django 2 零基础 - 待办清单网站

發(fā)布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django 2 零基础 - 待办清单网站 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

根據(jù)b站視頻https://www.bilibili.com/video/BV1bW411N7xN?p=8整理的
不清楚可以去看視頻喲

1前期準(zhǔn)備


pip freeze # 查看已安裝的包 pip install django==2.0.5 # 安裝django2.0.5 cd .. #返回上一級 cd Django_Projects django-admin startproject to_do_list # 創(chuàng)建項目 cd to_do_list # 進(jìn)入項目文件夾 python manage.py runserver # 啟動服務(wù)器 # 在瀏覽器網(wǎng)址欄輸入 localhost:8000 ctrl + c # 關(guān)閉服務(wù)器

成功顯示如下

2準(zhǔn)備app

  • 激活虛擬環(huán)境
cd desktopcd Django_venv # 到虛擬環(huán)境文件夾 cd Scripts # 執(zhí)行該文件 activate cd .. cd Django_Projects cd to_do_list # 進(jìn)入todo項目文件夾 python manage.py runserver # 啟動服務(wù)器 ctrl+c 關(guān)閉服務(wù)器
  • 一個app負(fù)責(zé)一種功能 創(chuàng)建一個 todolist App 負(fù)責(zé)實現(xiàn) 待辦事項 功能
python manage.py startapp todolist


將to_do_list整個拖到文本編輯器

  • 注冊該app,告訴服務(wù)器我存在
在settings.py INSTALLED_APPS 中加入 'todolist',
  • 在這個app里面做個html網(wǎng)頁,放在templates(網(wǎng)頁模板)文件夾中
右鍵 new file home.html

!tab
h1 tab 會自動生成


右鍵 open in browser 選default 選擇其他可能會出現(xiàn)找不到文件chrome

這種問題主要是因為在pycharm中關(guān)于chrome的安裝路徑配置不正確造成的,具體的解決辦法為:打開pycharm–》File–》setting–》Tools–》Web Browsers然后添加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處理
to_do_list/to_do_list/urls.py [所有網(wǎng)址首先由它接手]||||\ /\/ to_do_list/todolist/urls.py [與待辦事項相關(guān)的網(wǎng)址交給我接手]||||\ /\/ to_do_list/todolist/views.py [用戶通過這些網(wǎng)址發(fā)出的請求的由我來處理]

這里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的名字 命名

templates/app的名字/網(wǎng)頁名字views.py -> return render(request, "todolist/home.html")<a href="hostname/urlpattern"></a>

想改網(wǎng)址怎么辦?要改的地方好多o(╥﹏╥)o
給網(wǎng)址起名字

<a href="{% url 'url_name' %}"></a> template tag{% tag_name %}


網(wǎng)址名跟其他app里面的網(wǎng)址名字重復(fù)怎么辦?
給個前綴

8 模版繼承

我想改變導(dǎo)航欄的樣式怎么辦? 3個網(wǎng)頁都要改?
Template inheritance
做個模板html(所有網(wǎng)頁的風(fēng)格主題), 其他網(wǎng)頁繼承它,拓展它, 類似python的類繼承
extends

{% extends "base.html" %}block tag {% block blockname %}{% endblock blockname %}three-level 大網(wǎng)站建議三級,小網(wǎng)站兩級 article.html/ base_news.html / \ base.html live.html\base_sports.html


到main之前的 和之后的粘貼下來 做成base.html

{% block 主體%} {% endblock 主體 %}在被剪切的那個網(wǎng)頁放入 { % extends "todolist/base.html"%}{% block 主體 %}

9.靜態(tài)文件

新建static文件夾,存放 圖片 css javascript
里面,再新建一個app文件夾,避免與其他app的static文件夾里面的靜態(tài)文件沖突

app/static/app/images app/static/app/js app/static/app/css app/static/app/icons{% load static %} {% static "路徑" %}

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 只要將原來頁面返回給他即可

def edit(request):# 顯示回給用戶if request.method=='POST':content = {'待辦事項': request.POST['待辦事項']} # 因為request.post是字典 可以找他的key 而找到所對應(yīng)的值return render(request,"todolist/edit.html",content) #值顯示在這個網(wǎng)頁中elif request.method=='GET':return render(request, "todolist/edit.html")

如果是get請求怎么辦? request.POST 中不存在’待辦事項’這個鍵
如果是post請求, 但用戶不寫內(nèi)容怎么辦? request.POST 中的’待辦事項’這個鍵對應(yīng)值為 空的字符串 ‘’

def edit(request):# 顯示回給用戶if request.method=='POST':if request.POST['待辦事項']==' ':#如果用戶在待辦里什么都不寫 返回給頁面警告return render(request,"todolist/edit.html", {'警告':'請輸入內(nèi)容!'})else:content = {'待辦事項': request.POST['待辦事項']} # 因為request.post是字典 可以找他的key 而找到所對應(yīng)的值return render(request,"todolist/edit.html",content) #值顯示在這個網(wǎng)頁中elif request.method=='GET':return render(request, "todolist/edit.html")

用GET方法刪除,劃掉真的對嗎? 用隱藏的form
全局列表

{% for in %}{{ forloop.counter }}{% if %}{% else %}{% endif %}{% endfor %}"{% url 'todolist:刪除' forloop.counter %}" #中間的空格相當(dāng)于/del/<forloop_counter> #按照序號刪除 def delete(request,forloop_counter):lst.pop(int(forloop_counter)-1)return redirect("todolist:編輯") #不是渲染 render 而是跳轉(zhuǎn)到網(wǎng)址去(有名字的地方 不是網(wǎng)站) redirect()

重點在于 查找路徑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">&times;</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ā)者看的

makemigrations -> 中文:制作遷移文件 例如:0001_initial.py 也是用來描述表的構(gòu)成 django會利用這個文件來建表改表 每次新增model() 或者 修改model(表的構(gòu)成) 都要 makemigrations 這是給django自己看的,它用這個文件來建表或修改表 python manage.py sqlmigrate todolist 0001 不會真的建表,只是查看 查看django用 0001_initial.py 文件, 轉(zhuǎn)化成了什么sql語句(不同的數(shù)據(jù)庫服務(wù)器,語句不一樣)幫我們建表, todolist是app的名字 BEGIN; -- -- Create model Todo -- CREATE TABLE "todolist_todo" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,"thing" varchar(50) NOT NULL,"done" bool NOT NULL ); COMMIT; migrate -> 中文:遷移,即運行這個文件 0001_initial.py 真正在數(shù)據(jù)庫中建表,或修改表的結(jié)構(gòu) python mange.py shell from todolist.models import Todo Todo.objects.all() -> QuerySet 查詢集合 簡單理解為表中的所有數(shù)據(jù) -> 所有行的集合__str__ 顯示更友好,命令行以及admin界面 Todo.objects.count() -> 行的數(shù)量a_row = Todo(thing='逛街', done=False) -> 創(chuàng)建一行數(shù)據(jù), 但并未保存 a_row.save() -> 真正保存到庫中 a_row.id -> 保存之后才有id(序號)a_row.thing -> 獲取這一行的 thing(待辦事項) 的值Todo.objects.filter(done=False) -> 獲取 [[所有]] done 為 False 的行, 即未完成的事項, 結(jié)果是個集合 another_row = Todo.objects.get(thing='逛街') -> 獲取 thing 為 的行,僅一行 get不到會報錯another_row.thing = '去超市' -> 修改這一行的thing為 '去超市' another_row.save() -> 改完別忘了保存another_row.delete() -> 刪除這一行 Todo.objects.all() -> 看看現(xiàn)在有什么exit() ctrl+z 回車Register Models -> 注冊model 注冊后, 可以通過django自帶的app -> admin后臺界面來管理表數(shù)據(jù)a = Todo.objects.get(id=2) a.delete()

def cross(request,i_id):if request.POST['完成狀態(tài)']=='已完成':a = Todo.objects.get(id=i_id)a.done=Truereturn redirect("todolist:編輯")else:a = Todo.objects.get(id=i_id)a.done= Falsereturn redirect("todolist:編輯")#點擊劃掉按鈕 會向劃掉網(wǎng)址發(fā)送一個請求 post請求里面包含來了一個‘完成狀態(tài)’信息其對應(yīng)的值是已完成 然后交給views.py 的cross處理

—————————————————————————————————————————————

登錄注冊

思路

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

path('user_center/',views.user_center,name='個人中心'),path('user_center/edit_profile',views.編輯個人信息,name='編輯個人信息'),path('user_center/change_password',views.修改密碼,name='修改密碼'),

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。