Python Web應用程序(一)Django入門

系統:Ubuntu16.04html

Python版本:python3.5.2python

 

1、創建虛擬環境shell

要使用Django,首先須要創建一個虛擬工做環境。虛擬環境是系統中的一個位置,你能夠在其中安裝包,並將其與其餘Python包隔離。數據庫

將項目的庫與其餘項目分離是有益的。django

安裝virtualenv,終端運行編程

sudo apt-get install python-virtualenv

爲項目新建一個目錄,將其命名爲learning_log,並在終端切換到目錄learning_log,建立一個虛擬環境:segmentfault

virtualenv ll_env --python=python3

如圖:瀏覽器

激活虛擬環境:服務器

source ll_env/bin/activate

如圖:session

環境處於活動狀態時,環境名將包含在括號內。

關閉虛擬環境:

deactivate

安裝Django

(ll_env) czz@xcy-laptop:~/PycharmProjects/Project_3/learning_log$ pip install Django

在Django中建立項目(需在虛擬環境下):最後的句點千萬別忘了

django-admin startproject learning_log .

如圖:

建立數據庫:

python manage.py migrate

查看項目:

python manage.py runserver

將會 有以下輸出:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 20, 2019 - 08:10:02
Django version 2.2, using settings 'learning_log.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

打開瀏覽器,並輸入URL:http://127.0.0.1:8000/出現下面的頁面:

 

這是最新版的Django的默認啓動界面。暫且不要關閉它。

2、建立應用程序

前面打開的終端窗口應該還運行着runserver,再打開一個終端窗口,並切換到manage.py所在的目錄,激活虛擬環境並執行命令

python manage.py startapp learning_logs

定義模型:

打開models.py 添加

from django.db import models

# Create your models here.
class Topic(models.Model):
    """用戶學習的主題"""
    text = models.CharField(max_length=200)#由字符或文本組成的數據
    date_added = models.DateTimeField(auto_now_add=True)#記錄日期和時間的數據

    def _str_(self):
        """返回模型的字符串表示"""
        return self.text

建立了一個Topic類,它繼承了Model。

激活模型:

打開learning_log/learning_logs/settings.py,將前面的程序添加到這個元組中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #個人應用程序,以上都是自帶的,Django2.0這樣添加
    'learning_logs.apps.LearningLogsConfig',

]

在終端依次輸入

python manage.py makemigrations learning_logs
python manage.py migrate

每當須要修改「學習筆記」管理的數據時,都採起以下三個步驟:修改model.py;對learning_logs調用makemigrations;讓Django遷移項目。

建立超級用戶:終端輸入(虛擬環境下)

python manage.py createsuperuser

依提示輸入用戶名、密碼,郵箱能夠不填(Enter)

向管理網站註冊模型,在learning_logs中找到admin.py,打開並修改:

from django.contrib import admin

# Register your models here.
#導入模型Topic
from learning_logs.models import Topic
#註冊
admin.site.register(Topic)

終端執行命令,運行Django服務器:

python manage.py runserver

訪問http://localhost:8000/admin/,輸入用戶名和密碼,可見:

手動添加主題,單擊Topic,進入表單,使用add添加主題Chess和Rocking Climbing

 定義模型Entry:條目,多個條目可關聯同一主題

打開models.py

-----snip------
class Entry(models.Model):
    "學到的有關某個主題的具體知識"
    #外鍵,數據庫術語,將每一個條目關聯到特定的主題
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    #條目文本
    text = models.TextField()
    #時間戳
    date_added = models.DateTimeField(auto_now_add=True)
    #嵌套類Meta,它用於管理模型的額外信息。它讓咱們可以設置一個特殊屬性,讓Django在須要時
    # 使用Entries來表示多個條目。若是沒有這個類,Django將使用Entrys來表示多個條目,保證英語語法正確
    class Meta:
        verbose_name_plural = 'entries'
    #呈現條目時應顯示的信息
    def _str_(self):
        "返回模型的字符串表示"
        return self.text[:50] + '...'

遷移模型Entry,終端輸入:

python manage.py makemigrations learning_logs
python manage.py migrate

向網站註冊Entry,修改admin.py文件

from django.contrib import admin

# Register your models here.
#導入模型Topic
from learning_logs.models import Topic, Entry
#註冊
admin.site.register(Topic)
admin.site.register(Entry)

以上仍是老三步:修改model.py;對learning_logs調用makemigrations;讓Django遷移項目,而後在admin.py文件註冊Entry。

接下來就能夠添加條目了,在Chess中添加了一個條目,就不細寫了。

Django Shell

輸入一些數據後,可經過交互式終端會話以編程方式查看這些數據。這種交互式環境稱爲Django shell,是測試項目和排除故障的理想之地。

(ll_env)learning_log$ python manage.py shell   # 啓動shell
>>> from learning_logs.models import Topic
>>> Topic.objects.all()   # 得到模型Topic的全部實例
<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>  # 返回了一個查詢集QuerySet

>>> topics = Topic.objects.all()  # 查詢每一個Topic對象
>>> for topic in topics:
...     print(topic.id, topic)
...
1 Chess
2 Rock Climbing

>>> t = Topic.objects.get(id=1) # 根據id查看Chess模型的具體內容
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2018, 4, 22, 2, 4, 3, 723045, tzinfo=<UTC>)

>>> t.entry_set.all()  # 查看該主題下的全部條目,經過外鍵查詢,進行了人爲換行
<QuerySet [<Entry: The opening is the first part of the game, roughly...>,
<Entry: In the opening phase of the game, it's important t...>]>

 建立網頁:編寫學習筆記

Django建立網頁的過程一般分三個階段:定義URL、編寫視圖和編寫模板

映射URL

打開learning_log文件夾中的urls.py,修改爲以下內容:

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中建立另外一個urls.py文件:

'''定義learning_logs的url模式'''
from django.urls import path
from . import views

app_name = 'learning_logs'
urlpatterns = [
    #主頁
    path(r'', views.index, name='index'),#原書中的正則不行
]

 總之,就是在learning_log/urls.py中添加learning_log中的全部URL,並匹配主頁。

編寫視圖

打開learning_logs/views.py,添加

from django.shortcuts import render

# Create your views here.
def index(request):
    "學習筆記的主頁"
    return render(request, 'learning_logs/index.html')

編寫模板

learning_logs文件夾中新建一個templates文件夾,再在這個文件夾中新建一個和APP同名的文件夾,即learning_logs文件夾,最後,在這個learning_logs文件夾中新建index.html文件。index.html文件內容以下:

<p>Learning Log</p>

<p>Learning Log helps you keep track of your learning, 
    for any topic your're learning about.</p>

如今打開這個項目的基礎URL------http://localhost/8000/,能夠看到剛纔建立的網頁

 

建立其餘網頁

建立兩個用於顯示數據的網頁,其中給一個列出全部的主題,另外一個顯示特定主題的全部條目。對於每一個網頁都指定URL模式,編寫一個視圖函數,並編寫一個模板。但這麼作以前,咱們先建立一個父模板,項目中的其餘模板都將繼承它。

父模板base.html(在index.html所在的目錄下)

<p>
    <a href="{% url 'learning_logs:index' %}">Learning Log</a>
<p>
    
{% block content %}{% endblock content %}

第一段落是一個模板標籤,它匹配到主頁的連接。第二段插入了一對塊標籤,名爲content,其中的內容將由子模板指定。

子模板index.html修改

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

{% block content%}
  <p>Learning Log helps you keep track of your learning,
  for any topic your're learning about.</p>
{% endblock content %}

第一段標籤{% extends}表示繼承哪一個父模板,第二段,包含子模塊的內容。

顯示全部主題的頁面

1.URL模式

修改learning_logs/urls.py

'''定義learning_logs的url模式'''
from django.urls import path
from . import views

app_name = 'learning_logs'
urlpatterns = [
    #主頁
    path(r'', views.index, name='index'),
    #顯示全部主題頁面
    path(r'topics', views.topics, name=topics)#定義並匹配URL注意Django2.0path不支持正則表達,如要使用需導入re_path,使用re_path
]#注意是中括號,不是大括號,這塊出錯花了我很長時間。。。

視圖views.py

from django.shortcuts import render
from .models import Topic
# Create your views here.


def index(request):
    "學習筆記的主頁"
    return render(request, 'learning_logs/index.html')


def topics(request):
    """顯示全部的主題"""
    topics = Topic.objects.order_by('date_added')#訪問數據庫,將結果按時間排序並將查詢集存儲在 topics中
    context = {'topics': topics}#上下文字典,發送給模板,鍵是用來訪問數據的名稱,值是發送給模板的數據
    return render(request, 'learning_logs/topics.html', context)#這是一個渲染函數

模板

建立topics.html,並存儲到index.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 %}

修改父模板base.html,使其包含到顯示全部主題的頁面的連接

<p>
    <a href="{% url 'learning_logs:index' %}">Learning Log</a> -
    <a href="{% url 'learning_logs:topics' %}">Topics</a>
<p>

{% block content %}{% endblock content %}

如今若是進入http://localhost:8000/,將看到添加的Topics連接,單擊連接將看到

 

顯示特定主題的頁面

1.URL模式

修改learning_logs/urls.py

-----snip------
urlpatterns = [
   -------snip-------
    #特定主題的詳細頁面
    path(r'topics/<int:topic_id>/', views.topic, name='topic')#使用主題的ID來指出請求的是哪一個主題

]

視圖views.py

函數topic()須要從數據庫中獲取指定的主題以及與之相關聯的全部條目

------snip--------
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)

模板

在index.html所在的目錄下建立topic.html

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

{% block content %}

  <p>Topic: {{ topic }}</p>
  <p>Entries:</p>
  <ul>
  {% for entry in entriies% }
    <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.html

---------snip-----
{% for topic in topics%}
      <li>
        <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
      </li>
    {% empty %}
--------snip----------

刷新全部主題頁面,點擊Topics,選擇某一主題,將看到相似於下圖的畫面。

小結

1.制定了簡要的項目規範,在虛擬環境下安裝了Django,建立項目並覈實該項目已經正確的建立。

2.建立應用程序,定義表示應用程序數據的模型

3.建立數據庫,修改模型後,Django可爲遷移數據庫提供怎樣的幫助

4.建立超級用戶

5.Django shell

6.定義URL,建立視圖函數,編寫模板(包括模板的繼承)

本文爲《Python編程:從入門到實踐》筆記,並參考了博文https://segmentfault.com/a/1190000015098721

相關文章
相關標籤/搜索