在看這篇文章的時候,必須有django基礎,如果沒有點擊訪問
一、環境配置
新建項目並做配置項目創建,創建APP並注冊
創建靜態文件並配置,點擊訪問
配置數據庫,點擊訪問
目錄結構如下
配置blog的測試頁面,先測試是否正確配置
def test(request): ‘’‘ 博客的測試的視圖函數 ’‘’ return HttpResponse('博客的測試頁')
運行效果
博客發文涉及文章標題和內容,所以創建模型類
class Blog(models.Model): title = models.CharField(max_length=100) context = models.TextField() def __str__(self): return 'Blog<title=%s,context=%s>'%(self.title,self.context)
繼續原來的映射文件
makemigrations 和 migrate
查看表
二、視圖
添加四個視圖,渲染模板
def index(request): return render(request,'blog/demo_index.html') def add(request): return render(request,'blog/demo_add.html') def list(request): return render(request,'blog/demo_list.html') def detail(request): return render(request,'blog/demo_detail.html')
配置路由
path('index/',index,name='blog_index'), path('add/',add,name='blog_add'), path('detail/',detail,name='blog_detail'), path('list/',list,name='blog_list')
查看效果
ok,現在分析需求
可以整理如下條例
三、實現功能
1.index
修改demo_index.html 的a標簽
<td><a href="{% url 'blog_add' %}">添加文章</a></td> <td><a href="{% url 'blog_list' %}">文章列表</a></td>
即可實現主頁的所有的功能
2.add
創建的視圖函數進行修改,這里的發布博客按鈕是提交form表單,所以修改之前的模型類,將title屬性增加參數 blank=True
然后重新生成映射文件
可以看到,這里的文章標題的id=title,文章內容id=context
要獲取提交的表單內容,則要修改視圖,以傳參的方式將其傳遞進來並接收
就可以寫個樣一個判斷
if request.method == 'GET':
return render(request,'blog/demo_add.html')
elif request.method == 'POST':
title = request.POST.get('title')
context = request.POST.get('content')
打印一下title和content,發現成功的接收到了自己想要的東西
注意:
這里的requests.POST是一個QueryDict對象,類似字典,所以可以通過索引取值,拿到這里的title和content
整個函數的代碼就變成了這樣
def add(request): if request.method == 'GET': return render(request,'blog/demo_add.html') elif request.method == 'POST': title = request.POST.get('title') context = request.POST.get('content') return render(request,'blog/demo_add.html')
既然兩個分支條件都要渲染出這個模板,就可以修改
def add(request): if request.method == 'POST': title = request.POST.get('title') context = request.POST.get('content') return render(request,'blog/demo_add.html')
現在拿到了數據,下一步就是數據入庫,對django操作數據庫不懂的,可以參考模型
這里用create方法
只需要在拿到數據之后 Blog.objects.create(title=title,context=context) 即可
這里准備幾篇文章,以供測試

水調歌頭
明月幾時有?把酒問青天。不知天上宮闕,今夕是何年。我欲乘風歸去,又恐瓊樓玉宇,高處不勝寒。起舞弄清影,何似在人間?轉朱閣,低綺戶,照無眠。不應有恨,何事長向別時圓?人有悲歡離合,月有陰晴圓缺,此事古難全。但願人長久,千里共嬋娟。
卜算子·詠梅
驛外斷橋邊,寂寞開無主。已是黃昏獨自愁,更著風和雨。 無意苦爭春,一任群芳妒。零落成泥碾作塵,只有香如故。
聲聲慢
尋尋覓覓,冷冷清清,凄凄慘慘戚戚。乍暖還寒時候,最難將息。三杯兩盞淡酒,怎敵他、晚來風急?雁過也,正傷心,卻是舊時相識。滿地黃花堆積。憔悴損,如今有誰堪摘?守着窗兒,獨自怎生得黑?梧桐更兼細雨,到黃昏、點點滴滴。這次第,怎一個愁字了得!
武陵春
風住塵香花已盡,日晚倦梳頭。物是人非事事休,欲語淚先流。聞說雙溪春尚好,也擬泛輕舟。只恐雙溪舴艋舟,載不動許多愁。
查看效果
ok文章添加功能完成
3.list
思路:首先從數據庫拿到數據 ,然后渲染到模板上
def list(request): blogs = BlogMoudel.objects.all() return render(request,"blog/demo_list.html",context={'blog':blogs})
在這里需要將查到的Queryset對象傳到模板,然后遍歷,所以模板上需要改動tr標簽,將其放置在for循環
{% for foo in blog %} <tr> <th><a href="">{{ foo.title }}</a></th> <th><a href="">編輯</a> | <a href="">刪除 </a></th> </tr> {% endfor %}
效果:
還有個需求,要求點擊文章標題就能進入對應的詳情頁
思路:獲取點擊時對應的ID,將這個id接收,然后查找該文章,渲染出來
所以這里首先需要做出詳情頁的功能
4.detail
分析進入詳情頁的url,是需要有一個值來確定是哪一篇文章,所以可以在url里傳參
path('detail/<blog_id>',views.detail,name='blog_detail'),
視圖函數里查找數據庫
def detail(request,blog_id): blog = BlogMoudel.objects.get(id=blog_id) #查找指定id的文章 return render(request,"blog/demo_detail.html",context={'blog':blog}) #將變量傳遞到模板
模板修改只需要修改文章標題和內容的一塊區域
{% block bodyblock %} <h1>{{ blog.title }}</h1> {{ blog.context }} {% endblock %}
看下效果
詳情頁到這里就完成,現在只需要將url綁定到列表頁即可
直接修改demo_list.html,在編輯的a標簽連接上修改
<th><a href="{% url 'blog_detail' foo.id %}">{{ foo.title }}</a></th>
查看效果
這里還有刪除的按鈕,現在實現刪除
思路:獲取id,查找數據庫,刪除
同樣要知道需要刪除哪篇文章,需要傳參,定義一個刪除的url
path('delete/<blog_id>/',views.delete,name='blog_delete'),
然后創建一個視圖函數
def delete(request,blog_id): blog = BlogMoudel.objects.filter(id=blog_id) if blog: blog.delete() return HttpResponse('成功刪除') else: return HttpResponse('該文不存在')
函數邏輯很簡單,獲取文章,刪除文章
修改模板
<a href="{% url 'blog_delete' foo.id %}">刪除 </a>
但是這里同時發現一個問題,就是刪除之后,頁面並沒有刷新,繼續點擊則會報錯,所以這里可以定義一個頁面重定向
def delete(request,blog_id): blog = BlogMoudel.objects.filter(id=blog_id) if blog: blog.delete() redirect(reverse('blog_list')) else: return HttpResponse('該文不存在')
效果
最后有個編輯的頁面
5.edit
編輯功能類似增加,同樣是寫個url
path('edit/<blog_id>/',views.edit,name='blog_edit'),
然后視圖函數
def edit(request,blog_id): blog = BlogMoudel.objects.filter(id=blog_id).first() return render(request,'blog/demo_edit.html',context={'blog':blog})
邏輯很簡單,就是獲取文章,獲取的對象是一個Queryset對象,然后.first()獲取,再返回回去
繼續修改edit.html文件,其實就是demo_add.html文件,將其更名修改即可
<form action="" method="POST"> {% csrf_token %} 標題<input type="text" autocomplete="off" id="title" placeholder="請輸入標題" name='title' value="{{ blog.title }}"> <br> <br><br> 內容 <textarea name="content" id="content" placeholder="請輸入內容" cols="30" rows="10">{{ blog.context }}</textarea> <button type="submit">發布博客</button> </form>
效果
至此,簡單的博客就搭建完成了,其他的功能將會在后續的學習中逐步添加
以后的django基礎文章也會圍繞這個案例展開討論
本文為素心原創,轉載請注明出處