個人部落格小案例(純Django搭建)
在看這篇文章的時候,必須有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基礎文章也會圍繞這個案例展開討論
本文為素心原創,轉載請註明出處