Python博客(跟隨慕課網(wǎng)DJango課程學(xué)習(xí))

本博客是記錄跟從慕課網(wǎng)課程所記下的筆記,更多內(nèi)容請(qǐng)?jiān)L問慕課網(wǎng)慕課網(wǎng)--項(xiàng)目源碼

新建項(xiàng)目

  • 打開命令行,進(jìn)入到打算打算創(chuàng)建項(xiàng)目的目錄
  • 輸入 django-admin startproject 項(xiàng)目名字,本例中取名為myBlog

分析項(xiàng)目文件

項(xiàng)目目錄.png

manager.py

  • 與項(xiàng)目交互的命令行工具集入口

  • 項(xiàng)目管理器


    manager.py.png
  • 啟動(dòng)服務(wù)器runserver
    python mange.py runserver
    固定端口啟動(dòng) python mange.py runserver 端口號(hào)

    runserver.png

項(xiàng)目同名目錄 myBlog

  • 項(xiàng)目的一個(gè)容器
  • 包含項(xiàng)目的最基本的配置
  • 不建議修改

wsgi.py【Python服務(wù)器網(wǎng)管接口】

  • Python應(yīng)用和與web服務(wù)器之間的接口

url.py

  • URL配置我呢間
  • Django項(xiàng)目的所有地址(頁面)都需要在此文件中進(jìn)行配置

settings.py

  • 項(xiàng)目總配置文件
  • 包含數(shù)據(jù)庫,web應(yīng)用,時(shí)間等各種配置
    • BASE_DIR:項(xiàng)目根目錄
    • SECRET_KEY:安全碼,項(xiàng)目啟動(dòng)所必須,會(huì)自動(dòng)配置好
    • DEBUG: 是否是調(diào)試模式,生產(chǎn)環(huán)境要置為False
    • ALLOWED_HOSTS: 主機(jī)名,限制訪問系統(tǒng)的主機(jī)地址
    • INSTALLED_APPS:系統(tǒng)創(chuàng)建和自定義的應(yīng)用
    • MIDDLEWARE: 中間件,簡(jiǎn)單理解為項(xiàng)目,項(xiàng)目自帶的工具集
    • ROOT_URLCONF:URL的根文件,其默認(rèn)指向的就是url.py
    • TEMPLATES: 模板文件,Django中模板就是HTML文件
    • DATABASES:數(shù)據(jù)庫配置,默認(rèn)是其自帶的sqlite3,具體生產(chǎn)可以看Django官網(wǎng)對(duì)其他數(shù)據(jù)庫的配置要求
    • STATIC_URL: 靜態(tài)文件地址

init.py

  • 聲明模塊的文件,內(nèi)容可以為空

創(chuàng)建應(yīng)用

  • 進(jìn)入 manage.py的同級(jí)目錄
  • python manage.py startapp 應(yīng)用名
  • 創(chuàng)建完成以后將應(yīng)用名添加到setting.pyINSTALLED_APPS
  • 自己創(chuàng)建的應(yīng)用是不能和系統(tǒng)名字相同的
  • 應(yīng)用下各模塊介紹


    目錄.png
    • migrations: 數(shù)據(jù)移植模塊,其目錄下內(nèi)容都是系統(tǒng)生成的
    • admin.py: 該應(yīng)用下的后臺(tái)管理系統(tǒng)配置
    • app.py: 該應(yīng)用的一些配置,Django-1.9會(huì)自動(dòng)已生成,之前的版本沒有
    • models: 數(shù)據(jù)模塊模塊,存放數(shù)據(jù)表,但是DJango有ORM框架,一般會(huì)配合其使用
    • tests.py: 自動(dòng)化測(cè)試模塊,可以利用腳本進(jìn)行自動(dòng)化測(cè)試
    • views.py: 視圖模塊,執(zhí)行相應(yīng)的代碼所以在的模塊,代碼邏輯處理的主要地點(diǎn),項(xiàng)目大部分代碼均在這里編寫

創(chuàng)建響應(yīng)【在blog.views 模塊下】

  • 引入頭文件from django.http import HttpResponse
  • Django中每一個(gè)相應(yīng)都要通過一個(gè)函數(shù)處理,參數(shù)為請(qǐng)求,返回值為相應(yīng)
  • 配置相應(yīng)的url
    • 編輯urls.py
    • url 函數(shù)放在urlpattens列表中
    • url 函數(shù)參數(shù): URL(一般用政策表達(dá)式),url對(duì)應(yīng)的相應(yīng)函數(shù),url名稱(可選)

詳解url配置

  • 方式1:
    • 在views.py 中創(chuàng)建相應(yīng)函數(shù)
    • 在系統(tǒng)應(yīng)用rls.py引入此函數(shù),并在urlpattens中配置此url
  • 方式2:
    • 在blog應(yīng)用新建urls.py文件
    • 配置blog應(yīng)用下urls.py
      • 導(dǎo)入頭文件 from django.conf.urls import url
      • 導(dǎo)入相應(yīng)views.py
      • 新建urlpattens,并按照方式1中進(jìn)行url配置
    • 修改系統(tǒng)應(yīng)用下urls.py的頭文件 from django.conf.urls import url后面添加include,最終from django.conf.urls import url,include
    • 修改系統(tǒng)應(yīng)用urls.py模塊的urlpattens,url(r'^index/',include("blog.urls")),
  • tip:
    • 配置url正則的時(shí)候,空串可以用"^$"
    • 非空串在正則匹配之后,記得要加上反斜杠"^index/$"

創(chuàng)建Templates【模板】

  • Django中templates 就是指HTML文件
  • Django 要使用模板語言DTL(Django Templates Language)
  • 模板引擎很多,本例中使用的jinjia2,要修改模板引擎,可以在settings.pyTEMPLATESBACKEND鍵值
  • 具體步驟:
    • 在當(dāng)前應(yīng)用(不是系統(tǒng)應(yīng)用)新建一個(gè)文件夾,名字是Templates
    • 在Templates文件夾下新建HTML文件,如果項(xiàng)目存在多個(gè)應(yīng)用,那么在Tenplates下要新建一個(gè)與應(yīng)用同名的文件夾,然后將HTML文件創(chuàng)建在此目錄下
    • 在views.py中相應(yīng)函數(shù)中,返回render渲染的HTML文件
      • render 在views.py創(chuàng)建的過程中就已經(jīng)忍引入了 from django.shortcuts import render
      • render有很多參數(shù),比較常用的是: request,模板名稱.heml, 響應(yīng)給前端的數(shù)據(jù)
    • render函數(shù)支持一個(gè)字典參數(shù),key為傳遞給前臺(tái)的數(shù)據(jù)的key值,value就是傳遞的數(shù)值

創(chuàng)建Models

  • Django中一個(gè)model對(duì)應(yīng)一張數(shù)據(jù)庫表,models以類的形式存在,所以處理數(shù)據(jù)不會(huì)與SQL打交道,是對(duì)對(duì)象進(jìn)行操作
  • ORM : 對(duì)象關(guān)系映射,實(shí)現(xiàn)了對(duì)象和數(shù)據(jù)庫之間的映射,隱藏了數(shù)據(jù)訪問細(xì)節(jié),不編寫SQL語句
  • 具體創(chuàng)建models
    • 在應(yīng)用的根目錄下創(chuàng)建models.py,并引入models 模塊【系統(tǒng)在創(chuàng)建應(yīng)用的時(shí)候已經(jīng)做了】
    • 創(chuàng)建類,繼承models.Model,該類就是一張數(shù)據(jù)表
    • 類中創(chuàng)建數(shù)據(jù)表字段
      • 字段即類中的屬性
      • 格式 attr = models.數(shù)據(jù)類型(),
        例如title = models.CharField(max_length=32,default='title')
        更多數(shù)據(jù)類型請(qǐng)?jiān)L問這里
  • 映射到數(shù)據(jù)表,即數(shù)據(jù)遷移
    • 命令行進(jìn)入manage.py同一級(jí)目錄
    • 執(zhí)行Python manage.py makemigrations 應(yīng)用名
      如果不傳應(yīng)用名,會(huì)將該項(xiàng)目下所有的應(yīng)用制作數(shù)據(jù)遷移
    • 執(zhí)行python mange.py migrate
    • Django會(huì)自動(dòng)在 應(yīng)用/migrations/目錄下生成移至文件
  • sql語句查看 python manage.py sqlmigrate 應(yīng)用名 文件id
  • 獲取數(shù)據(jù)庫中數(shù)據(jù)
    • views.py 中引入import models
    • 獲取數(shù)據(jù) article = models.Article.objects.get(參數(shù))
      參數(shù)可以是具體條件而定,本例用使用主鍵作為參數(shù):
      article = models.Article.objects.get(pk=1)

Admin

  • Django 自帶的一個(gè)功能強(qiáng)大的自動(dòng)化數(shù)據(jù)管理界面
  • 被授權(quán)的用戶可以直接在Admin中管理數(shù)據(jù)庫
  • Django 提供了很多針對(duì)Admin的定制功能
  • 具體操作:
    • 創(chuàng)建超級(jí)管理員
      python manage.py createsuperuser
    • 通過http://localhost:8000/admin/訪問后臺(tái)界面
    • 修改界面為中文界面--修改settings.py中`LANGUAGE_CODE = 'zh_Hans'
  • 配置應(yīng)用下的admin.py
    • 引入自身models模塊(或里面的模型類)
    • 編輯admin.py : admin.site.register(models.Article)
  • 修改系統(tǒng)數(shù)據(jù)的默認(rèn)顯示方式
    • 在相應(yīng)的類下面添加一個(gè)方法
      py3.x : __str__ (self):
      py2.7 : __unicode__(self):
      返回值為想要在后臺(tái)系統(tǒng)中展示的數(shù)據(jù),本例中是用的self.title

博客主界面

  • 主頁面內(nèi)容: 文章標(biāo)題列表(含有主鏈接),發(fā)表博客按鈕(含有超鏈接)
  • 文章列表編寫思路:
    • 取出數(shù)據(jù)庫中所有文章對(duì)象
      • 修改views.py articles = models.Article.objects.all()
    • 文章打包成列表,傳遞給前端
      • 將數(shù)據(jù)封裝為對(duì)象返回給前臺(tái)
        return render(request,"blog/index.html", {"articles": articles})
    • 前端頁面獲取到文章數(shù)據(jù),以標(biāo)題超鏈接的形式列出
      • 在前端頁面遍歷數(shù)據(jù),格式為{%for xx in xxs %}

博客文章頁面

  • 思路:

    • 標(biāo)題
    • 文章內(nèi)容
    • 修改文章按鈕(超鏈接)
  • 添加響應(yīng)函數(shù)函數(shù),為了獲取具體的文章,要將代表文章的參數(shù)(本例中選擇id)傳入

def article_page(request,article_id):
          article = models.Article.objects.get(pk=article_id)
          return render(request,"blog/article_page.html",{"article":article})
  • 創(chuàng)建HTML模板,展示標(biāo)題和內(nèi)容
<body>
    <h1>{{article.title}}</h1>
    <br>
    <h3>{{article.content}}</h3>
    <br>
    <br>
    <a href="">修改文章</a>
</body>
  • urls.py配置url:
    • 整體思路:在遺忘配置的url的鏈接后邊追加文章的Id
    • 具體實(shí)現(xiàn): url(r'^article/(?P<article_id>[0-9]+)$',bv.article_page)
      其中(?P<article_id>[0-9]+) 中article_id要和響應(yīng)函數(shù)中的文字Id的參數(shù)名保持一致

博客主頁面鏈接到文章頁面

  • 超鏈接目標(biāo)地址,即a標(biāo)簽的href屬性后邊的鏈接地址,在Django中有固定的寫法{%url "app_name : url_naeme" param %}

    • app_name: 應(yīng)用的命名空間
    • url_name:url鏈接名
    • param: 參數(shù)
    • {%url ....%} 是固定的寫法
    • 注意字符串
      *具體寫法
    • 再言u(píng)rl的配置---url的第三個(gè)參數(shù)(在有inclue的情況下就是第二個(gè)參數(shù)),寫法有兩種:
      • 寫法1:在有include的情況下,include的第2個(gè)參數(shù)為定位namespace="應(yīng)用的命名空間"
      • 寫法2:在沒有include的情況下,第3個(gè)參數(shù)為name = "應(yīng)用的命名空間"
  • 配置的這兩個(gè)名字就是url_name的值

  • app_name取的是系統(tǒng)應(yīng)用下的url配置的命名空間

  • 以上兩個(gè)名字可以隨便定義,沒有固定的要求

博客撰寫頁面

  • 思路
    • 頁面:標(biāo)題編輯欄,文章編輯區(qū)域,提交按鈕
    • 提交數(shù)據(jù),利用form表單
  • 實(shí)現(xiàn):
    • 編寫前端界面
<body>
<form action="" method="post">
    <label> 文章標(biāo)題:
    <input type="text" name="title">
    </label>
    <br>
    <label> 文章內(nèi)容:
    <input type="text" name="content">
    </label>
    <br>
    <input type="submit" value="提交">
</form>

  • 添加頁面的響應(yīng)【配置url,寫響應(yīng)函數(shù)等等和前面一樣,不贅述】
  • 寫form表單提交的響應(yīng),存儲(chǔ)新文章數(shù)據(jù)
    • 編輯相應(yīng)函數(shù):
      使用reques.POST["參數(shù)名"]獲取表單數(shù)據(jù);
      models.Article.objects.create(title= "", content="")創(chuàng)建數(shù)據(jù)對(duì)象,并存儲(chǔ)
  • post 提交保單的時(shí)候,要添加{% csrf_token %},為了網(wǎng)絡(luò)安全

修改文章

  • 思路:新建文章和修改文章都是跳轉(zhuǎn)文章撰寫文章頁面,不同的是修改文章頁面需要向撰寫文章頁面?zhèn)魅胛恼耰d,為了不增加url,在這兩個(gè)操作都傳入Id,撰寫頁面?zhèn)魅?,其他頁面根據(jù)數(shù)據(jù)庫自己添加
  • 具體實(shí)現(xiàn):
    • 修改編輯頁面的響應(yīng)函數(shù),增加文章id,根據(jù)Id進(jìn)行判斷,為0則直接返回編輯頁面,否則根據(jù)Id取出文章對(duì)象,并將對(duì)象和頁面一起返回
def edit_page(request,article_id):
    if str(article_id) == "0":
        return  render(request,"blog/edit_page.html")
    article = models.Article.objects.get(pk=article_id)
    return render(request, "blog/edit_page.html",{"article":article })
  • 修改頁面
    首頁的新文章的鏈接的url總增加參數(shù)0
    文章頁面的修改文章的鏈接url,傳入文章Id

  • 提交操作的處理

    • 思路:提交的響應(yīng)函數(shù)也要增加文章id,此id不是參數(shù),而是從前端頁面?zhèn)魅?,從request中獲取
      如果為0的話,就創(chuàng)建文章;
      如果不為0,就取出對(duì)象,修改屬性并保存。
def edit_action(request):
    title = request.POST.get("title")
    content = request.POST.get("content")
    article_id = request.POST.get("article_id")
    if str(article_id) == "0":
        models.Article.objects.create(title=title,content=content)
        articles = models.Article.objects.all()
        return render(request, "blog/index.html", {"articles": articles})
    article = models.Article.objects.get(pk=article_id)
    article.title = title
    article.content = content
    article.save()
    return render(request, "blog/article_page.html", {"article": article})
  • 在頁面增加一個(gè)隱藏的input用于將文字Id轉(zhuǎn)入到后臺(tái)
<form action="{% url "blog:edit_action" %}" method="post">
    {% csrf_token %}
    {% if article %}
        <input type="hidden" name="article_id" value="{{ article.id }}">
        <label> 文章標(biāo)題:
            <input type="text" name="title", value="{{ article.title }}">
        </label>
        <br>
        <label> 文章內(nèi)容:
            <input type="text" name="content" value="{{ article.content }}">
        </label>
    {% else %}
        <input type="hidden" name="article_id" value="0">
        <label> 文章標(biāo)題:
            <input type="text" name="title">
        </label>
        <br>
        <label> 文章內(nèi)容:
            <input type="text" name="content">
        </label>
    {% endif %}
    <br>
    <input type="submit" value="提交">
</form>

番外篇:Django的一些使用技巧

過濾器

  • 寫在模板中的,屬于DJDe 模板語言
  • 可以修改模板的變量,從而顯示不同頁面
  • 格式 : {{value| 過濾器}}
  • 疊加{{value | filter1 | filter2 ......}}
  • 例子: {{list_number| length}} 值為list_number的長(zhǎng)度
  • 實(shí)戰(zhàn): 修改文章頁面的if else
############### 修改前 #######################
<body>
<form action="{% url "blog:edit_action" %}" method="post">
    {% csrf_token %}
    {% if article %}
        <input type="hidden" name="article_id" value="{{ article.id }}">
        <label> 文章標(biāo)題:
            <input type="text" name="title", value="{{ article.title }}">
        </label>
        <br>
        <label> 文章內(nèi)容:
            <input type="text" name="content" value="{{ article.content }}">
        </label>
    {% else %}
        <input type="hidden" name="article_id" value="0">
        <label> 文章標(biāo)題:
            <input type="text" name="title">
        </label>
        <br>
        <label> 文章內(nèi)容:
            <input type="text" name="content">
        </label>
    {% endif %}
    <br>
    <input type="submit" value="提交">
</form>
</body>
###############修改后#######################
<body>
<form action="{% url "blog:edit_action" %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="article_id" value="{{ article.id | default:"0" }}">
    <label> 文章標(biāo)題:
        <input type="text" name="title", value="{{ article.title }}">
    </label>
    <br>
    <label> 文章內(nèi)容:
        <input type="text" name="content" value="{{ article.content }}">
    </label>
    <br>
    <input type="submit" value="提交">
</form>
</body>
  • 解析
    • 首先介紹DJ的一個(gè)模板特性,<input type="text" name="title", value="{{ article.title }}"> 當(dāng)模板中遇到一個(gè)沒有定義的變量時(shí),不會(huì)報(bào)錯(cuò),會(huì)默認(rèn)給一個(gè)空串,這樣,即便不做if判斷也可以兼容新文章頁面和文章編輯頁面
    • 但是,后臺(tái)修改數(shù)據(jù)的時(shí)候,需要將文字id傳入到后臺(tái),即我們寫的隱藏的input便簽,這時(shí)如果傳空就會(huì)報(bào)錯(cuò),此時(shí)我們用default 過濾器,即默認(rèn)值 value="{{ article.id | default:"0"}},就可以兼容了

Django shell

  • 本質(zhì)也是一個(gè)交互命令行,但是可以引入項(xiàng)目環(huán)境,與項(xiàng)目交互

  • 操作: python manage.py shell 就可以引入項(xiàng)目換將,然后就可以交互界面中實(shí)現(xiàn)項(xiàng)目代碼

    djShell.png

  • Admin

  • 為了增加后臺(tái)管理的功能,要修改應(yīng)用下admin.py,改變注冊(cè)方式

  • 具體操作:

    • 創(chuàng)建admin 配置類class ArticleAdmin(admin.ModelAdmin)
    • 在注冊(cè)代碼中,綁定注冊(cè)類 admin.site.register(Article,ArticleAdmin)
    • 修改配置類,增加功能
    • 代碼
class ArticleAdmin(admin.ModelAdmin):
    # 增加顯示列數(shù),建議后面用元組,因?yàn)椴豢尚薷?,且列名要與數(shù)據(jù)庫字段名保持一致
    list_display = ("title","content")
admin.site.register(Article,ArticleAdmin)
  • 過濾功能(本例中以時(shí)間過濾為例子)
    • models.py增加一個(gè)時(shí)間字段
      pub_time = models.DateTimeField(auto_now=True) auto_nows屬性為True的時(shí)候會(huì)自動(dòng)賦值的當(dāng)前日期,但在控制臺(tái)中不能修改,若想修改則去掉此屬性
  • 在admin.py中增加此字段的顯示list_display = ("title","content","pub_time") 然后數(shù)據(jù)遷移
    admin.png
  • 修改admin.py給時(shí)間增加過濾器list_filter = ("pub_time",)
filter.png
  • 此時(shí)后臺(tái)數(shù)據(jù)就可以進(jìn)篩選
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容