--- tags: 自學筆記系列 --- # dijango架設方式 (必須複製Hackmd的原始碼) ## 初始化設定 1.確定python版本後,在vscode的terminal中打上 :::info pip install django ::: 2.在vscode的terminal中將目前的操作路徑移至想要的資料夾中,接著打上 :::info django-admin startproject potrip ::: (目的是在此資料夾下建立專案 potrip是自訂名稱) 接著在manage.py所在的資料夾中打上 :::info python manage.py startapp quotes ::: (目的是創建views.py等檔案) 接著在與manage.py同個資料夾下創建一名稱為templates的資料夾 4.在settings.py中的開頭打上 :::info import os ::: 並在settings.py中的TEMPLATES中的'DIRS'後打上: :::info os.path.join(BASE_DIR, 'templates') ::: (目的是為了讓程式能定位templates資料夾) ## 創建首頁 4.在urls.py的開頭打上 :::info from quotes import views ::: 並在urls.py中的urlpatterns打上 :::info path("", views.home), ::: (目的是透過urls.py連結views.py中的home函式,並設定home函式為首頁) 5.在views.py中打上 :::info def home(request): return render(request, 'index.html', {}) ::: (定義home函式,要求其回傳index.html網頁,即首頁,.html名字可更改) 6.在tempalates資料夾中創建index.html檔案,即為首頁的html ## 使用\<a>連結至其他網頁 1.將html的\<a>元素改成這種形式 :::info \<a href="{% url '自訂name' %}"> 例如: \<a class="nav-link" href="{% url 'about' %}"> (內文的\\為跳脫字元) ::: 2.在urls.py中新增path :::info path("此網站在顯示時相對於localhost的位置", views.py對應的函式,name='自訂name'), 例如: path("about", views.about,name='about'), ::: 3.在views.py中新增對應的函式 :::info def 與urls.py對應的函式名(request): return render(request, '想要顯示的html檔案', {}) 例如: def about(request): return render(request, 'about.html', {}) ::: ## 使用POST送出表單資料 1.在Html中的form元素給定以下屬性 :::info <form action="{% url '後端對應的url' %}" method="post"> 例如: <form action="{% url 'home' %}" method="post"> ::: 接著在form元素涵蓋的區域中打上 :::info {% csrf_token %} (非常重要,不然會因為隱私問題跳錯) ::: 並在form元素涵蓋的區域中的input元素使用name來決定對應的資料應該傳到哪裡 :::info 例如: <input class="form-control" id="inputEmail" placeholder="name@example.com" name="UserAccount"/> ::: 2.在urls.py中的urlpatterns設定相對應的url與連結views.py中的函式 :::info path("與前端對應的url", views.對應的views.py函式,name="用name屬性來連結html與urls.py"), 例如: path("home", views.home,name="home"), ::: 3.在views.py中撰寫對應的函式,並使用.POST的方法取得資料,[]中放前端對應的name :::info 例如: def home(request): account=request.POST['UserAccount'] passward=request.POST['UserPassword'] ::: ## 使用說明 1.每次要使用時,用vscode開啟對應的資料夾(自己建的資料夾下的第一層potrip) 2.在vscode中的terminal中打上 :::info python manage.py runserver ::: 啟動伺服器,網址在terminal中 打上ctrl+C結束伺服器 3.有更新資料庫時,在terminal中打上 :::info python manage.py migrate ::: (目的是更新資料庫) ## Debug紀錄 1.無法在Django環境下引用CSS和Js等等,參考 https://codeantenna.com/a/jWdiXNiSQm https://blog.csdn.net/weixin_41529093/article/details/115655557 簡單來說就是把CSS,Js等東西的檔案丟到static資料夾中,在html中引用時,格式如下 :::info {% static '檔案路徑' %} 例如: {% static 'css/styles.css' %} ::: 記得要在html中的<head>中加上 :::info {%load static %} ::: 2.更新以canva嵌入的javascript網頁後,要按ctrl+F5刷新網頁 3.從Django後端傳參數至Html的javascript中,可以這麼做 (1)在views.py中搞定要回傳的參數 (2)將參數用return的方式回傳,想傳回多個參數則以逗號隔開 :::info return render(request, 'home.html', {'在html中的參數名':在views.py中的參數名}) 例如: def home(request): score=50 return render(request, 'home.html', {'score':score}) ::: (3)在html中用<script>嵌入javascript程式碼,注意須寫在引用該段程式碼的位置的下方 (4)在javascript中使用 :::info var 在javascript的變數名={{在html中的變數名}}; 例如: var Score={{score}}; 此處的Score即為所求 ::: (5)若傳的參數為陣列,則views.py的程式碼需改成這樣: :::info return render(request, 'home.html', {'在html中的參數名':json.dumps(在views.py中的參數名)}) 例如: def home(request): score_Data=[10,20,30,40,50,60] return render(request, 'home.html', {'score_Data':json.dumps(score_Data)}) ::: 嵌入的Js程式碼改成這樣: :::info var 在javascript的變數名={{在html中的變數名\|safe}}; 例如: var Score_Data={{score_Data\|safe}}; 此處的Score即為所求 (內文的\\為跳脫字元) ::: (6)若發現從bootstrap引用的程式碼中的javascript無法順利執行(ex:導覽列無法順利切換) ->檢查是否加入jquery標頭檔 ->檢查是否加入對應版本的JS標頭檔 額外補充:在同一區域的不同文字切換似乎跟tab頁籤切換有關