Dajango 搭建Web筆記


一、環境搭建
1.要使用 Django ,首先需要建立一個虛擬工作環境。 虛擬環境 是系統的一個位置,你可以在其中安裝包,並將其與其他 Python 包隔離

新建一個目錄,將其命名爲 learning_log ,再在終端中切換到這個目錄,並創建一個虛擬環境。如果你使用的是 Python 3 ,
可使用如下命令來創建虛擬環境.

learning_log$ python -m venv ll_env

2.激活虛擬環境

learning_log$ source ll_env/bin/activate(linux 下) 

ll_env\Scripts\activate (window 下)

3.停止使用虛擬環境
  deactivate

4.安裝 Django
創建並激活虛擬環境後,就可安裝 Django 了:
pip install Django


5.在 Django 中創建項目
在依然處於活動的虛擬環境的情況下( ll_env 包含在括號內),執行如下命令來新建一個項目:
django-admin.py startproject learning_log .


6.創建數據庫
創建一個供 Django 使用的數據庫,處於活動虛擬環境中的情況下執行下面的命令
python manage.py migrate

7.覈實 Django 是否正確地創建了項目:
 python manage.py runserver

二、創建應用:
Django 項目 由一系列應用程序組成,它們協同工作,讓項目成爲一個整體。

1.在前面打開的終端窗口中應該還運行着 runserver

再打開一個終端窗口(或標籤頁),並切換到 manage.py 所在的目錄。激活該虛擬環境,再執行命令 startapp :

ll_env/bin/activate 激活

python manage.py startapp learning_logs

2.定義模型

打開文件 models.py 編輯自己的主題模型,添加如下代碼:
class Topic(models.Model):
  text = models.CharField(max_length=200)
  date_added = models.DateTimeField(auto_now_add=True)
  # toString
  def __str__(self):
    return self.text

激活模型
 settings.py (它位於目錄 learning_log/learning_log 中)

將應用添加到 INSTALLED_APPS中
INSTALLED_APPS = (
--snip--
#  my app
'learning_logs',
)

接下來,需要讓 Django 修改數據庫,使其能夠存儲與模型 Topic 相關的信息,
在終端窗口中執行下面的命令:
(ll_env)learning_log$ python manage.py makemigrations learning_logs
命令 makemigrations 讓 Django 確定該如何修改數據庫,使其能夠存儲與我們定義的新模型相關聯的數據。輸出表明 Django 
創建了一個名爲 0001_initial.py 的遷移文件,這個文件在數據庫中爲模型 Topic 創建一個表。


下面來應用這種遷移,讓 Django 替我們修改數據庫:
(ll_env)learning_log$ python manage.py migrate


三、Django 管理網站
1.  創建超級用戶
 (ll_env)learning_log$ python manage.py createsuperuser

2.  向管理網站註冊模型
Django 自動在管理網站中添加了一些模型,如 User 和 Group ,但對於我們創建的模型,必須手工進行註冊。
創建應用程序 learning_logs 時, Django 在 models.py 所在的目錄中創建了一個名爲 admin.py 的文件:
添加如下代碼:
from learning_logs.models import Topic
admin.site.register(Topic)

訪問http://localhost:8000/admin/ 這個個網頁讓你能夠添加和修改用戶和用戶組,還可以管理與剛纔定義的模型 Topic 相關的數據
然後可在topic部分添加(add)主題


四:定義模型 Entry
eg:要記錄學到的國際象棋和攀巖知識,需要爲用戶可在學習筆記中添加的條目定義模型。每個條目都與特定主題相關聯,這種關係被稱爲多對一關係,即多個條目可關聯到同一個
主題。
1.models.py 添加

class Entry(models.Model):
  topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
  text = models.TextField()
  date_added = models.DateTimeField(auto_now_add=True)

  class Meta:
      verbose_name_plural = 'entries'

  def __str__(self):
      return self.text[:50] + "..."
第一個屬性 topic 是一個 ForeignKey 實例這些代碼將每個條目關聯到特定的主題。每個主題創建時,都給它分配了一個鍵(或 ID ),
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個可選擇的值:

CASCADE:此值設置,是級聯刪除;

PROTECT:此值設置,是會報完整性錯誤;

SET_NULL:此值設置,會把外鍵設置爲null,前提是允許爲null;

SET_DEFAULT:此值設置,會把設置爲外鍵的默認值;

SET():此值設置,會調用外面的值,可以是一個函數。


2.遷移模型 Entry
(ll_env)learning_log$ python manage.py makemigrations learning_logs

3.向管理網站註冊 Entry
爲此,需要將 admin.py 修改成類似於下面這樣:
from django.contrib import admin
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)

五:Django shell
python manage.py shell
交互式終端會話可以以編程方式查看數據


六、創建網頁
1.打開項目主文件夾 learning_log 中的文件 urls.py,包含 learning_logs 的 URL
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('learning_logs.urls', namespace='learning_logs')), 
]

2.默認的 urls.py 包含在文件夾 learning_logs 中,現在我們需要在文件夾 learning_logs 中創建另一個 urls.py 
from django.urls import path
from . import views
app_name='learning_logs'
urlpatterns = [
    # homePage
    path('', views.index, name='index'),
]

3.編寫視圖
learning_logs 中的文件 views.py 是你執行命令 python manage.py startapp 時自動生成的,修改其內容:
from django.shortcuts import render
# Create your views here.
def index(request):
    # incdex page
    return render(request, 'learning_logs/index.html')

4。編寫模板
在文件夾 learning_logs 中新建一個文件夾,並將其命名爲 templates 。
在文件夾 templates 中,再新建一個文件夾,並將其命名爲 learning_logs
在最裏面的文件夾 learning_logs 中,新建一個文件,並將其命名爲 index.html
<p>Learning Log</p>
<p>Welcome,Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>
如此,首頁便創建成功,瀏覽訪問localhost:8000即可查看結果

5.創建其他網頁
模板繼承:創建網站時,幾乎都有一些所有網頁都將包含的元素。在這種情況下,可編寫一個包含通用元素的父模板,並讓每個網頁都繼承這個模板,而不必在每個網頁中重複定義這些通
用元素。

 父模板 base.html,並將其存儲在 index.html 所在的目錄中:

<p><a href="{% url 'learning_logs:index' %}">Learning Log</a></p>
{% block content %}{% endblock content %}
 
 子模板 重新編寫index.html:
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>
{% endblock content %}

6.顯示所有主題的頁面
URL 模式
修改 learning_logs/urls.py :
from django.urls import path
from . import views
app_name='learning_logs'
urlpatterns = [
    # homePage
    path('', views.index, name='index'),
    # all topics
    path('topics/', views.topics, name='topics'),
]

修改視圖,views.py添加如下:
from .models import Topic
def topics(request):
    topics = Topic.objects.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)
編寫topics.html:
{% extends "learning_logs/base.html" %}


{% block content %}

  
<p>Topics</p>
  
  
<ul>
    
{% for topic in topics %}
   
   <li>{{ topic }}</li>
    
{% empty %}
      
<li>No topics have been added yet.</li>
    
{% endfor %}
  </ul>
 
 
{% endblock content %}
修改父模板,使其包含到顯示所有主題的頁面的鏈接:
<p>
    <a href="{% url 'learning_logs:index' %}">Learning Log</a>
    <a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}

7.顯示特定主題的頁面
learning_logs/urls.py添加如下代碼:
from django.urls import path, re_path

re_path(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),

這裏用到了python正則表達式,/(?P<topic_id>\d+)/與包含在兩個斜槓內的整數匹配,
並將這個整數存儲在一個名爲topic_id的實參中。?P<topic_id>將匹配的值存儲到topic_id中;
而表達式\d+與包含在兩個斜杆內的任何數字都匹配,不管這個數字爲多少位。


發現URL與這個模式匹配時,Django將調用視圖函數topic(),並將存儲在topic_id中的值作爲實參傳遞給它。

learning_logs/views.py 添加如下代碼:
def topic(request, topic_id):
    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by('-date_added')
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

templates\learning_logs下添加topic.html:
{% extends 'learning_logs/base.html' %}

{% block content %}

  <p>Topic: {{ topic }}</p>

  <p>Entries:</p>
  <ul>
  {% for entry in entries %}
    <li>
      <p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
      <p>{{ entry.text|linebreaks }}</p>
    </li>
  {% empty %}
    <li>
      There are no entries for this topic yet.
    </li>
  {% endfor %}
  </ul>

{% endblock content %}

修改topics模板

{% extends "learning_logs/base.html" %}

{% block content %}

  <p>Topics</p>

  <ul>
    {% for topic in topics %}
      <li>
        <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
      </li>
    {% empty %}
      <li>No topics have been added yet.</li>
    {% endfor %}
  </ul>

{% endblock content %}
 

一篇更爲詳細的:https://blog.csdn.net/miss1181248983/article/details/95473776 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章