个人博客小案例(纯Django搭建)
在看這篇文章的時候,必須有django基礎(chǔ),如果沒有點(diǎn)擊訪問
一、環(huán)境配置
新建項(xiàng)目并做配置項(xiàng)目創(chuàng)建,創(chuàng)建APP并注冊
創(chuàng)建模板并配置相應(yīng)的路徑,點(diǎn)擊下載模板,配置方法點(diǎn)擊訪問
創(chuàng)建靜態(tài)文件并配置,點(diǎn)擊訪問
配置數(shù)據(jù)庫,點(diǎn)擊訪問
目錄結(jié)構(gòu)如下
配置blog的測試頁面,先測試是否正確配置
def test(request): ‘’‘ 博客的測試的視圖函數(shù) ’‘’return HttpResponse('博客的測試頁')運(yùn)行效果
博客發(fā)文涉及文章標(biāo)題和內(nèi)容,所以創(chuàng)建模型類
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)繼續(xù)原來的映射文件
?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,現(xiàn)在分析需求
可以整理如下條例
三、實(shí)現(xiàn)功能
?1.index
修改demo_index.html 的a標(biāo)簽
<td><a href="{% url 'blog_add' %}">添加文章</a></td><td><a href="{% url 'blog_list' %}">文章列表</a></td>即可實(shí)現(xiàn)主頁的所有的功能
2.add
?創(chuàng)建的視圖函數(shù)進(jìn)行修改,這里的發(fā)布博客按鈕是提交form表單,所以修改之前的模型類,將title屬性增加參數(shù)?blank=True?
然后重新生成映射文件
可以看到,這里的文章標(biāo)題的id=title,文章內(nèi)容id=context
要獲取提交的表單內(nèi)容,則要修改視圖,以傳參的方式將其傳遞進(jìn)來并接收
?就可以寫個樣一個判斷
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,發(fā)現(xiàn)成功的接收到了自己想要的東西
注意:
這里的requests.POST是一個QueryDict對象,類似字典,所以可以通過索引取值,拿到這里的title和content
整個函數(shù)的代碼就變成了這樣
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')現(xiàn)在拿到了數(shù)據(jù),下一步就是數(shù)據(jù)入庫,對django操作數(shù)據(jù)庫不懂的,可以參考模型
這里用create方法
只需要在拿到數(shù)據(jù)之后?Blog.objects.create(title=title,context=context)?即可
這里準(zhǔn)備幾篇文章,以供測試
水調(diào)歌頭 明月幾時有?把酒問青天。不知天上宮闕,今夕是何年。我欲乘風(fēng)歸去,又恐瓊樓玉宇,高處不勝寒。起舞弄清影,何似在人間?轉(zhuǎn)朱閣,低綺戶,照無眠。不應(yīng)有恨,何事長向別時圓?人有悲歡離合,月有陰晴圓缺,此事古難全。但愿人長久,千里共嬋娟。卜算子·詠梅 驛外斷橋邊,寂寞開無主。已是黃昏獨(dú)自愁,更著風(fēng)和雨。 無意苦爭春,一任群芳妒。零落成泥碾作塵,只有香如故。聲聲慢 尋尋覓覓,冷冷清清,凄凄慘慘戚戚。乍暖還寒時候,最難將息。三杯兩盞淡酒,怎敵他、晚來風(fēng)急?雁過也,正傷心,卻是舊時相識。滿地黃花堆積。憔悴損,如今有誰堪摘?守著窗兒,獨(dú)自怎生得黑?梧桐更兼細(xì)雨,到黃昏、點(diǎn)點(diǎn)滴滴。這次第,怎一個愁字了得!武陵春 風(fēng)住塵香花已盡,日晚倦梳頭。物是人非事事休,欲語淚先流。聞?wù)f雙溪春尚好,也擬泛輕舟。只恐雙溪舴艋舟,載不動許多愁。 測試文章?查看效果
?
ok文章添加功能完成
3.list
思路:首先從數(shù)據(jù)庫拿到數(shù)據(jù) ,然后渲染到模板上
def list(request):blogs = BlogMoudel.objects.all()return render(request,"blog/demo_list.html",context={'blog':blogs})在這里需要將查到的Queryset對象傳到模板,然后遍歷,所以模板上需要改動tr標(biāo)簽,將其放置在for循環(huán)
{% for foo in blog %}<tr><th><a href="">{{ foo.title }}</a></th><th><a href="">編輯</a> | <a href="">刪除 </a></th></tr>{% endfor %}效果:
?還有個需求,要求點(diǎn)擊文章標(biāo)題就能進(jìn)入對應(yīng)的詳情頁
思路:獲取點(diǎn)擊時對應(yīng)的ID,將這個id接收,然后查找該文章,渲染出來
所以這里首先需要做出詳情頁的功能
4.detail
分析進(jìn)入詳情頁的url,是需要有一個值來確定是哪一篇文章,所以可以在url里傳參
path('detail/<blog_id>',views.detail,name='blog_detail'),視圖函數(shù)里查找數(shù)據(jù)庫
def detail(request,blog_id):blog = BlogMoudel.objects.get(id=blog_id) #查找指定id的文章return render(request,"blog/demo_detail.html",context={'blog':blog}) #將變量傳遞到模板模板修改只需要修改文章標(biāo)題和內(nèi)容的一塊區(qū)域
{% block bodyblock %}<h1>{{ blog.title }}</h1>{{ blog.context }} {% endblock %}看下效果
詳情頁到這里就完成,現(xiàn)在只需要將url綁定到列表頁即可
直接修改demo_list.html,在編輯的a標(biāo)簽連接上修改
<th><a href="{% url 'blog_detail' foo.id %}">{{ foo.title }}</a></th>查看效果
這里還有刪除的按鈕,現(xiàn)在實(shí)現(xiàn)刪除
思路:獲取id,查找數(shù)據(jù)庫,刪除
同樣要知道需要刪除哪篇文章,需要傳參,定義一個刪除的url
?path('delete/<blog_id>/',views.delete,name='blog_delete'),?
然后創(chuàng)建一個視圖函數(shù)
def delete(request,blog_id):blog = BlogMoudel.objects.filter(id=blog_id)if blog:blog.delete()return HttpResponse('成功刪除')else:return HttpResponse('該文不存在')函數(shù)邏輯很簡單,獲取文章,刪除文章
修改模板
<a href="{% url 'blog_delete' foo.id %}">刪除 </a>但是這里同時發(fā)現(xiàn)一個問題,就是刪除之后,頁面并沒有刷新,繼續(xù)點(diǎn)擊則會報(bào)錯,所以這里可以定義一個頁面重定向
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'),?
然后視圖函數(shù)
?
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()獲取,再返回回去
繼續(xù)修改edit.html文件,其實(shí)就是demo_add.html文件,將其更名修改即可
<form action="" method="POST"> {% csrf_token %}標(biāo)題<input type="text" autocomplete="off" id="title"placeholder="請輸入標(biāo)題" name='title' value="{{ blog.title }}"> <br> <br><br>內(nèi)容 <textarea name="content" id="content"placeholder="請輸入內(nèi)容" cols="30" rows="10">{{ blog.context }}</textarea><button type="submit">發(fā)布博客</button></form>效果
至此,簡單的博客就搭建完成了,其他的功能將會在后續(xù)的學(xué)習(xí)中逐步添加
以后的django基礎(chǔ)文章也會圍繞這個案例展開討論
本文為素心原創(chuàng),轉(zhuǎn)載請注明出處
轉(zhuǎn)載于:https://www.cnblogs.com/chancey/p/10254409.html
總結(jié)
以上是生活随笔為你收集整理的个人博客小案例(纯Django搭建)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows系统镜像下载
- 下一篇: 手机停机号码被回收后容易信息泄露?工信部