去年的事情特別多,也沒有什么時間充電學習。今年目測輕松一點,年初本來計劃就好好休息一下,結果一晃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添加namespaceurlpatterns = [ 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)