Django學習筆記

去年的事情特別多,也沒有什么時間充電學習。今年目測輕松一點,年初本來計劃就好好休息一下,結果一晃2017就度過了一半。人輕松一點的時候就可以放松思想去思考很多事情,思來想去,發現還是要搞一點事情。遂決定學學python,這幾天看著教程敲了敲代碼,記錄一下?
代碼地址:https://github.com/huibaoer/simpleBlog

安裝django

登陸官網https://www.djangoproject.com/ 到下載頁面

  • 方法1 若安裝了pip,使用官網推薦方式pip安裝
  • 方法2 源碼安裝,頁面右側 latest release:下載最新的django。解壓后在django根目錄執行命令:python3 setup.py install

創建django工程

  • 安裝好django后終端中會有django-admin命令,跳轉到準備創建工程的目錄下,執行命令 django-admin startproject myblog
  • 創建好工程后可以啟動服務,查看效果,跳轉到工程根目錄(manage.py的同級目錄)執行命令:python3 manage.py runserver

為創建好的工程添加應用

  • 跳轉到工程根目錄執行命令:python3 manage.py startapp blog
  • 將新添加的應用添加到工程設置中
  INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'blog',
  ]

添加第一個響應

  • views.py文件中導入類 from django.http import HttpResponse
  • 在views中每個響應都是一個函數,創建響應的函數:
  def index(request):
      return HttpResponse("Hello World!")
  • 配置url,在urls.py中添加配置:
  import blog.views

  urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^index/', blog.views.index),
  ]
  • 命令行執行命令python3 manage.py runserver,查看經典的 ‘Hello World!’ 吧

為blog應用添加自己的urls.py配置文件

  • 在根urls.py中引入include
  from django.conf.urls import url, include
  from django.contrib import admin

  urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^blog/', include('blog.urls')),
  ]
  • 在blog應用下新建urls.py文件,并添加如下代碼
  from django.conf.urls import url
  from . import views

  urlpatterns = [
      url(r'^index/', blog.views.index),
  ]

為blog添加Templates

  • 在blog根目錄下創建Templates目錄,在Templates目錄下創建blog同名目錄(防止同名文件)
  • blog目錄下創建index.html文件
  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>Title</title>
  </head>
  <body>
  <h1>hello,blog</h1>
  </body>
  </html>
  • 在views.py中返回render(),即可在瀏覽器中看到效果
  def index(request):
      return render(request, 'blog/index.html')
  • 使用render()傳遞參數
    • render()中添加字典參數
      def index(request):
        return render(request, 'blog/index.html', {'text': 'hello,blog,hahaha'})
    
    • index.html中使用render()傳遞過來的參數
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>{{text}}</h1>
      </body>
      </html>
    

Models

  • 在應用根目錄下models.py文件下引入models模塊,創建類,繼承models.Model,該類即是一張表,在該類中創建數據表的字段
  from django.db import models


  class Article(models.Model):
      title = models.CharField(max_length=32, default='Title')
      content = models.TextField(null=True)
  • 將數據模型映射成數據表
    命令行中進入manage.py同級目錄,執行 python3 manage.py makemigrations app(可選);再執行 python3 manage.py migrate

  • 查看db.sqlite3數據庫
    可以使用數據庫可視化工具查看生成的數據庫內容,如navicat。blog_article就是models.py文件下創建的Article類生成的表,在blog_article表中添加一條記錄,用于后續查看

  • 頁面呈現model數據

    • blog下的views.py下返回Article對象,引入models,獲取鍵值為1的對象并返回
        from django.shortcuts import render
        from django.http import HttpResponse
        from . import models
    
        def index(request):
            article = models.Article.objects.get(pk=1)
            return render(request, 'blog/index.html', {'article': article})
    
    • 修改前端,顯示article對象返回的數據
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>{{ article.title }}</h1>
      <h2>{{ article.content }}</h2>
      </body>
      </html>
    

admin

  • 配置admin
    • 創建用戶 python3 manage.py createsuperuser 創建超級用戶
    • 啟動服務,登錄admin,查看效果
    • 將admin后臺修改為中文,在settings.py中修改 LANGUAGE_CODE = 'zh_Hans'
  • 配置應用,才能admin下管理應用
    • 在應用下admin.py中引入自身的models模塊(或者里面的模型類)
    • 編輯admin.py:admin.site.register(models.Article)
      from django.contrib import admin
      from . import models
    
      admin.site.register(models.Article)
    
    • 登錄admin,可以對數據進行增刪改查等操作。同時可以使用數據庫視圖化工具實時查看數據庫中的數據變化
    • 修改數據默認顯示的名稱,在Article類下添加一個方法,python3使用str(self),python2使用_unicode(self)
      class Article(models.Model):
        title = models.CharField(max_length=32, default='Title')
        content = models.TextField(null=True)
    
        def __str__(self):
            return self.title
    

myblog完善

  • 博客頁面設計
    • 博客主頁面

      • 文章標題列表,超鏈接
      • 發表博客按鈕(超鏈接)
        后臺代碼:
        def index(request):
          articles = models.Article.objects.all()
          return render(request, 'blog/index.html', {'articles': articles})
      

      前端代碼:

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
      
        <h1>
            <a href="">新文章</a>
        </h1>
        {% for article in articles %}
            <a href="">{{ article.title }}</a>
            <br/>
        {% endfor %}
        </body>
        </html>
      
    • 博客文章內容頁面

      • 標題
      • 文章內容
      • 修改文章按鈕(超鏈接)
        首先在Templates目錄下,添加article_page.html文件
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
        <h1>{{ article.title }}</h1>>
        <br/>
        <h3>{{ article.content }}</h3>>
        <br/><br/>
        <a href="">修改文章</a>
        </body>
        </html>
      

      在views.py下添加article_page函數

        def article_page(request, article_id):
          article = models.Article.objects.get(pk=article_id)
          return render(request, 'blog/article_page.html', {'article': article})
      

      最后,urls.py中配置url,并傳遞article_id參數(使用主鍵id作為article_id),注意傳遞article_id參數的正則表達式的寫法

        urlpatterns = [
            url(r'index/', views.index),
            url(r'article/(?P<article_id>[0-9]+)', views.article_page),
        ]
      

      添加超鏈接,實現點擊列表頁面中文章標題后跳轉到指定文章的效果,django的Templates中超鏈接的寫法 href="{% url 'app_namespace:url_name' param %}"
      在根urls.py下,為blog url添加namespace

        urlpatterns = [
          url(r'^admin/', admin.site.urls),
          url(r'^blog/', include('blog.urls', namespace='blog')),
        ]
      

      在blog的urls.py下,為article url添加name

        urlpatterns = [
            url(r'index/', views.index),
            url(r'article/(?P<article_id>[0-9]+)', views.article_page, name='article_page'),
        ]
      

      在index.html中添加超鏈接

        <body>
      
        <h1>
            <a href="">新文章</a>
        </h1>
        {% for article in articles %}
            <a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
            <br/>
        {% endfor %}
        </body>
      
    • 博客撰寫頁面

      • 標題編輯欄
      • 文章內容編輯區域
      • 提交按鈕
        首先創建edit_page.html文件
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
        <form action="{% url 'blog:edit_action' %}" method="post">{% csrf_token %}
            <label>文章標題
                <input type="text" name="title"/>
            </label>
            <br/>
            <label>文章內容
                <input type="text" name="content">
            </label>
            <br/>
            <input type="submit" value="提交">
        </form>
      
        </body>
        </html>
      

      在views.py中添加編輯頁面和提交按鈕的函數

        def edit_page(request):
          return render(request, 'blog/edit_page.html')
      
        def edit_action(request):
            title = request.POST.get('title', 'TITLE')
            content = request.POST.get('content', 'CONTENT')
            models.Article.objects.create(title=title, content=content)
            articles = models.Article.objects.all()
            return render(request, 'blog/index.html', {'articles': articles})
      

      在urls.py中添加相關url

        urlpatterns = [
            url(r'index/$', views.index),
            url(r'article/(?P<article_id>[0-9]+)/$', views.article_page, name='article_page'),
            url(r'edit/$', views.edit_page, name='edit_page'),
            url(r'edit/action/$', views.edit_action, name='edit_action'),
        ]
      

      最后在index.html文件中添加‘新建文章’超鏈接

        <a href="{% url 'blog:edit_page' %}">新文章</a>
      
      • 文章撰寫頁面添加修改文章功能
        上面的文章撰寫頁面實現了,點擊index頁面的新文章按鈕,跳轉到文章撰寫頁面,然后創建新文章。但是博客還需要有修改已有文章的功能,下面完善文章撰寫頁面,讓其擁有修改文章的功能
        思路如下:跳轉到文章撰寫頁面的時候需要傳遞一個article_id作為參數,當新建文章時,article_id為0;當修改文章時,article_id為該文章的鍵值id。

        • views.py下,為edit_page,添加article_id參數
          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})
        
        • 配置edit_page函數的url,添加參數article_id
          url(r'edit/(?P<article_id>[0-9]+)/$', views.edit_page, name='edit_page'),
        
        • 編輯article_page.html的修改文章超鏈接,傳遞參數article_id
          <a href="{% url 'blog:edit_page' article.id %}">修改文章</a>
        
        • 編輯index.html的新建文章超鏈接,傳遞參數article_id為0
          <a href="{% url 'blog:edit_page' 0 %}">新文章</a>  
        
        • 在edit_page.html中根據article_id的值區分是新建文章還是修改文章,修改文章需要將文章的內容填寫在編輯框內
          <form action="{% url 'blog:edit_action' %}" method="post">
            {% csrf_token %}
            {% if article %}
                <label>文章標題
                    <input type="text" name="title" value="{{ article.title }}"/>
                </label>
                <br/>
                <label>文章內容
                    <input type="text" name="content" value="{{ article.content }}"/>
                </label>
            {% else %}
                <label>文章標題
                    <input type="text" name="title" "/>
                </label>
                <br/>
                <label>文章內容
                    <input type="text" name="content" "/>
                </label>
            {% endif %}
            <br/>
            <input type="submit" value="提交">
          </form>
        
        • 編輯頁面點擊提交按鈕,是新建文章的話就創建新的數據model;是修改文章的話就修改本編文章的數據model。
          • 方法1,同樣使用修改url,添加article_id參數的方式判斷
          • 方法2,不修改url。通過隱藏的input標簽傳遞article_id
            下面使用方法2來實現,在edit_page.html中添加隱藏的input標簽。
          <form action="{% url 'blog:edit_action' %}" method="post">
            {% csrf_token %}
            {% if article %}
                <input type="hidden" name="article_id" value="{{ article.id }}">
                <label>文章標題
                    <input type="text" name="title" value="{{ article.title }}"/>
                </label>
                <br/>
                <label>文章內容
                    <input type="text" name="content" value="{{ article.content }}"/>
                </label>
            {% else %}
                <input type="hidden" name="article_id" value="0">
                <label>文章標題
                    <input type="text" name="title" "/>
                </label>
                <br/>
                <label>文章內容
                    <input type="text" name="content" "/>
                </label>
            {% endif %}
            <br/>
            <input type="submit" value="提交">
          </form>
        

        下面修改views.py的提交按鈕的響應函數

          def edit_action(request):
            title = request.POST.get('title', 'TITLE')
            content = request.POST.get('content', 'CONTENT')
            article_id = request.POST.get('article_id', '0')
        
            if 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})
        

小技巧

  • 過濾器
    {{ value | filter }},例如:{{ article_id | default:'0' }}表示article_id的缺省值為0
  • Django shell
    python3 manage.py shell 啟動Django shell,可以進行調試
  • admin
    配置admin,更多可參考Django文檔
  class ArticleAdmin(admin.ModelAdmin):
      list_display = ('title', 'content')

  admin.site.register(models.Article, ArticleAdmin)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容