更換數據表mysql
上文說到編寫好了我們的 model 模塊,映射生成數據表,之前我們用的是Django 默認的數據庫 sqlite3 ,這里我們更改一下使用 mysql。
我們在 navicat for mysql 中新建數據庫 blogdjango 。
至于 navicat for mysql 的安裝及配置請大家自行百度。
在 settings.py 文件中:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'blogdjango',
'USER':'root',
'PASSWORD':'', # 這里填寫密碼
'HOST':'127.0.0.1'
}
}
上文我們映射生成數據表是在 manage.py 的同級目錄下:
E:\myblog>
這里我們在換一種運行方式,目的是多了解一種運行方式。
在pycharm 上方的 Tools 菜單下有一個:
點擊之后出現:
如果跟我的不一樣,可能是沒有安裝 mysql 驅動,安裝一下就好了,如果出錯,可以看一下這篇文章
接下來跟上文一樣,執行 makemigrations 和 migrate 。
完成之后,到navicat 查看生成的數據表。:
這一部分跟上文的大致一樣,只是換一個數據庫,還是可以用 sqlite3 。步驟一樣。
注意到我們自己寫的數據表也在上方
我們在我們編輯的數據表里添加一些字段。
我們插入了一條記錄。
頁面呈現數據
數據我們有了,我們要把數據展現在頁面上
后臺步驟
- 在 views.py 中 import models
article = models.Article.objects.get(pk=1)
render(request,page,{'article':article})
from . import models
def index(request):
article = models.Ariticle.objects.get(pk=1)
return render(request, 'blog/index.html',{'article':article})
后臺步驟
模板可直接使用對象以及對象的 ‘ . ’ 操作
{{article.title}}就可以了
在模板 templates 下的index.html 文件中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<h3>{{ article.content }}</h3>
</body>
</html>
最后我們啟動一下服務
admin 簡介
Admin 是 Django 自帶的一個功能強大的自動化數據管理界面。
自帶的后臺管理系統
被授權的用戶可直接在 Admin 中管理數據庫(增刪改查)
Django 提供了許多針對 Admin 的定制功能
配置 Admin
Django 已經幫我們創建一個 admin 我們只需要創建一個用戶就可以了
- 創建一個用戶
python manage.py createsuperuser 創建一個超級用戶
看一下我的創建過程:
"D:\pycharm\PyCharm 2018.2\bin\runnerw.exe" C:\Users\19244\AppData\Local\Programs\Python\Python36-32\python.exe "D:\pycharm\PyCharm 2018.2\helpers\pycharm\django_manage.py" createsuperuser E:/myblog
Tracking file by folder pattern: migrations
Username (leave blank to use '19244'): admin
Email address: admin@admin.com
Warning: Password input may be echoed.
Password: sixkery
Warning: Password input may be echoed.
Password (again): sixkery123
Error: Your passwords didn't match.
Warning: Password input may be echoed.
Password: sixkery@123
Warning: Password input may be echoed.
Password (again): sixkery@123
Superuser created successfully.
Process finished with exit code 0
密碼選好,為了保密 。
localhost:8000/admin Admin入口
開啟服務,訪問一下:
登錄看一下:
看到是英文,好吧,我們改一下顯示成中文
在 settings.py 文件中修改:
LANGUAGE_CODE = 'zh_Hans'
就可以了。再次登錄查看就會顯示中文。
可以顯示中文了,但是我們的數據呢?
這里想要操作數據,還要配置一下應用
在應用下 admin.py 中引入自身的 models 模塊(或里面的模型類)
在 admin.py 文件下添加 admin.site.register(models.Aritcle)
from django.contrib import admin
from blog.models import Ariticle
admin.site.register(Ariticle)
切換瀏覽器,刷新一下頁面:
我們可以點進去修改數據等操作。
修改數據庫默認名稱
- 在 Article 類下添加一個方法
根據 python 版本選擇
python 3:str(self)
python 2:_unicode(self)
return self.title
在 models.py 文件下:
from django.db import models
class Ariticle(models.Model):
# 有必選參數,最大長度
title = models.CharField(max_length=32,default='Title')
# 沒有必選參數,這里可以為空
content = models.TextField(null=True)
def __str__(self):
return self.title
改完之后,重新刷新頁面:
完善博客
通過前面的學習,我們已經大致了解 django 下面就把我們的博客完善一下吧。
博客頁面設計
主要由三個頁面組成
博客主頁面
博客文章內容頁面
博客寫作撰寫頁面
主頁面內容
這里是我們博客的入口頁面主要有以下兩個內容
- 文章標題列表,超鏈接
- 發表博客的按鈕(超鏈接)
編寫思路
- 從數據庫中取出所有的文章對象
- 將文章打包成列表,傳遞到前端
- 前端頁面把文章以標題超鏈接的形式逐個列出
模板 for 循環
{% for xx in xxs %}
HTML 語句
{% endfor %}
在 views.py 文件下:
from django.shortcuts import render
from django.http import HttpResponse
from . import models
def index(request):
# 獲取所有的文章對象
articles = models.Ariticle.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>
重啟下服務器:
博客文章頁面
頁面內容
- 標題
- 文章內容
- 修改文章的按鈕(超鏈接)
代碼:
def index(request):
# 獲取所有的文章對象
articles = models.Ariticle.objects.all()
return render(request, 'blog/index.html',{'articles':articles})
def article_page(request,article_id):
# 文章頁面
article = models.Ariticle.objects.get(pk=article_id)
return render(request,'blog/article_page.html',{'article':article})
在templates文件夾下的blog文件下新建一個 article_page.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Article Page</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<br/>
<h3>{{ article.content }}</h3>
<br/><br/>
<a href="">修改文章</a>
</body>
</html>
配置 url
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index),
path('article/<int:article_id>/', views.article_page),
]
這里注意正則表達式的寫法。
啟動服務:
Django 中的超鏈接
超鏈接的目標地址:在 HTML 語言中,href 后面的是目標地址
在 Django
template 中可以用 {%url 'app_name:url_name' param%}
其中 app_name 和 url_name 都在 url 中配置
在配 URL
url 函數的名稱參數
- 根 urls 寫在 include() 的第二個參數位置, namespace='blog'
- 應用下則寫在 url() 的第三個參數位置, name='article'
這兩種方式寫法主要取決于是否使用 include() 引用了另一個 url 配置文件
根 urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls',namespace='blog')),
path('blog2/', include('blog2.urls')),
]
應用下 urls.py:
from django.urls import path
from . import views
app_name = 'blog' # 這句一定要加
urlpatterns = [
path('index/', views.index),
path('article/<int:article_id>/', views.article_page,name='article'),
]
配置之后打開頁面發現鏈接可以使用了
博客撰寫頁面開發
頁面內容
- 標題編輯欄
- 文章內容編輯區域
- 提交按鈕
首先創建一個 HTML 文件,。命名為 edit_page
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Edit Page</title>
</head>
<body>
<from action="" method="post">
<label>文章標題
<input type="text" name="title"/>
</label>
<br/>
<label>文章內容
<input type="text" name="content"/>
</label>
<br/>
<input type="submit">
</from>
</body>
</html>
前端頁面寫完了,我們分析一下后端怎么寫,這里雖然只有一個編輯的頁面,但是其實涉及到了兩個響應函數,一個是這個頁面本身的響應函數,一個是表單提交的目的地。
在views.py 文件中寫響應函數。
def edit_page(request):
return render(request,'blog/edit_page.html')
添加 url :
urlpatterns = [
path('index/', views.index),
path('article/<int:article_id>/', views.article_page,name='article_page'),
path('edit/', views.edit_page)
啟動服務就可以看到頁面啦
接下來完成表單提交的響應函數
這里是接收數據提交給后臺,所以要用到 post 方法
使用request.POST['參數名'] 獲取表單數據
models.Article.objects.create(title,content) 創建對象
def edit_action(request):
title = request.POST.get('title','TITLE') # 獲取request里的數據
content = request.POST.get('content','CONTENT') # 獲取request里的數據
models.article.objects.create(title=title,content=content) # 創建文章對象
articles = models.Article.objects.all()
return render(request,'blog/index.html',{'articles':articles}) # 返回主頁面
添加 url
urlpatterns = [
path('index/', views.index),
path('article/<int:article_id>/', views.article_page,name='article_page'),
path('edit/', views.edit_page,name='edit_page'),
path('edit/action/', views.edit_action,name='edit_action')
]
再把前端的url添加進去
<form action="{% url 'blog:edit_action' %}" method="post">
然后啟動服務,會報錯,原因是Django 的安全模式,不允許隨便提交數據。這里在下方添加:
<form action="{% url 'blog:edit_action' %}" method="post">
{% csrf_token %}
<label>文章標題
原本到這里我以為都可以了,結果運行之后沒有報錯,但是卻沒有執行頁面跳轉的動作。老司機一看就知道,哪里寫錯了。對的,確實是寫錯了,但是是哪里呢?
血的教訓啊,排查了老半天也沒整出來,無奈上網找答案。百般搜索無果。哇,真是崩潰。出去溜達一圈再說。
不得不說,pycharm 這個編輯器真好,當你寫錯都會提示,恩,沒錯,就是單詞寫錯了。在我上方貼的代碼中有兩處寫錯了,第一個是models 里的定義類:Ariticle,沒辦法這個寫錯,數據庫都要重新遷移。一頓操作。。。
還有一個,編輯頁面的 HTML 里 form 這個單詞寫成 from 了。
這里就當個教訓好了,希望大家別犯這樣低級的錯誤。手動捂臉。
好了,繼續。
我們在編輯新文章頁面添加了數據跳轉到主頁面:
我們把新文章的鏈接也補充一下:
在主頁的 index.HTML 文件中:
<a href="{% url 'blog:edit_page' %}">新文章</a>
這樣就OK啦
修改文章
這里要單獨說一下這個功能,修改文章要有文章才能叫做修改,不同于新文章,什么都沒有,所以直接調轉到新文章頁面是不行的。那要怎么做呢?
先來比較一下兩個編輯頁面
新文章為空,修改文章有內容
修改文章頁面有文章對象
那么為什么會有這個對象呢?就是文章的 ID 唯一標識符。
我們把編輯頁面的響應函數修改一下,添加一個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})
def edit_action(request):
title = request.POST.get('title','TITLE') # 獲取request里的數據
content = request.POST.get('content','CONTENT') # 獲取request里的數據
article_id = request.POST.get('article','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}) # 跳轉到文章頁面
主頁的 HTML 中修改:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>
<a href="{% url 'blog:edit_page' 0 %}">新文章</a>
</h1>
{% for article in articles %}
<a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
<br/>
{% endfor %}
</body>
</html>
文章頁面中的修改文章按鈕出修改(HTML):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Article Page</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<br/>
<h3>{{ article.content }}</h3>
<br/><br/>
<a href="{% url 'blog:edit_page' article.id %}">修改文章</a>
</body>
</html>
最后是編輯頁面,判斷有沒有文章id,如果有就修改文章,沒有就普通的從空白處編輯文章。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Edit Page</title>
</head>
<body>
<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>
<br/>
{% else %}
<input type="hidden" name="article_id" value="0"/>
<label>文章標題
<input type="text" name="title"/>
</label>
<br/>
<label>文章內容
<input type="text" name="content"/>
</label>
<br/>
{% endif %}
<input type="submit" value="提交">
</form>
</body>
</html>
這里主要是在創建頁面的時候記得帶上id 唯一標識符,這樣才能順利的操作頁面,編寫邏輯代碼,實現功能。
這樣就可以啦!終于完成了博客的開發,雖然看上去沒有什么新奇的東西,但是一整套的流程下來,讓我們熟悉了 Django 的簡單網頁的開發。
一些小技巧
templates 過濾器
過濾器就是寫在模板中的,屬于 Django 模板語言
它的作用是可以修改模板中的變量,從而顯示不同的內容。
寫法
{{ value | filter }} 例:{{ list_nums | length }}
我們之前寫的編輯頁面的代碼好多重復的,使用一下過濾器:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Edit Page</title>
</head>
<body>
<form action="{% url 'blog:edit_action' %}" method="post">
{% csrf_token %}
<input type="hidden" name="article_id" value="{{ article.id | default:'0' }}"/>
<label>文章標題
<input type="text" name="title" value="{{ article.title }}"/>
</label>
<br/>
<label>文章內容
<input type="text" name="content" value="{{ article.content }}"/>
</label>
<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
把if-else 語句也省了,是不是很好玩呀。
admin增強
我們想把內容也顯示出來怎么做呢?
我們先來看看我們的 admin.py 文件:
from django.contrib import admin
from blog.models import Article
admin.site.register(Article)
我們看到Article類是通過admin方法直接注冊到后臺管理系統的,那我們從這里改一下:
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','content')
admin.site.register(Article,ArticleAdmin)
這樣就可以啦!
總結
到這里就結束了,整個博客開發下來就是熟悉 Django 的過程,當然還有好多好玩的都沒有實現。這個博客就當是入門了解一下Django好了。后面還有更多好玩的東西等著我去探索,希望一起進步!