Django實現簡易部落格
好久不寫文章了,今天來用Django實現一個簡單的個人部落格。
1.首先,我們開啟終端建立一個Django專案:django-admin startproject test
2.然後建立一個app:python manage.py startapp blog
3.在settings.py裡面配置好埠:ALLOWED_HOSTS = ['*']
以及資料庫:DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE':'django.db.backends.mysql', # 資料庫的儲存引擎
'NAME':'test_django3',
'USER':'xps',
'PASSWORD':'qwe123',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
4.在專案的_init_.py配置使用mysql:
import pymysql
pymysql.install_as_MySQLdb()
5.為blog建立一個urls.py,並用主路由給它分配路由:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('add/',views.add,name='blog_add'),
path('list/',views.list,name='blog_list'),
path('detail/<blog_id>/' ,views.detail,name='blog_detail'),
path('index/',views.index,name='blog_index'),
path('edit/<blog_id>',views.edit,name='blog_edit'),
path('delete/<blog_id>/',views.delete,name='blog_delete'),
]
6.然後我們在app裡面建立model:
from django.db import models
# Create your models here.
# 部落格表
class BlogModel(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100, blank=True)
content = models.TextField()
7.settings.py裡面配置模板路徑:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True, # 設定為True之後,app得註冊, 會去app裡面的templates找模板
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
8.建立要用到的模板:
/templates/blog/demo_base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}
<div>
<a href="{% url 'blog_index' %}">主頁</a>
</div>
{% endblock %}{% block bodyblock %}{% endblock %}
</body>
</html>
templates/blog/demo_add.html
{% extends 'blog/demo_base.html' %}{% block title %}
新增部落格
{% endblock %}{% block bodyblock %}
<h1>新增新文章</h1>
<form action="{% url 'blog_add' %}" method="POST">
{% csrf_token %}
標題<input type="text" autocomplete="off" id="title"
placeholder="請輸入標題" name='title'> <br> <br><br>
內容 <textarea name="content" id="content"
placeholder="請輸入內容" cols="30" rows="10"></textarea>
<button type="submit">釋出部落格</button>
</form>
{% endblock %}
t
templates/blog/demo_list.html
{% extends 'blog/demo_base.html' %}{% block title %}
文章列表
{% endblock %}{% block bodyblock %}
<h1 style="margin-left: 100px">文章列表</h1>
<table width="400px">
<thead style="font-size:20px">
<tr>
<th>標題</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for blog in blog_list %}
<tr>
<th><a href="{% url 'blog_detail' blog_id=blog.id %}">{{ blog.title }}</a></th>
<th><a href="{% url 'blog_edit' blog_id=blog.id %}">編輯</a> | <a href="{% url 'blog_delete' blog.id %}">刪除 </a></th>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
templates/blog/demo_detail.html
{% extends 'blog/demo_base.html' %}{% block title %}
文章詳情
{% endblock %}{% block bodyblock %}
<h1>{{ blog.title }}</h1>
{{ blog.content }}{% endblock %}
templates/blog/demo_index.html
{% extends 'blog/demo_base.html' %}{% block title %}
部落格首頁
{% endblock %}{% block bodyblock %}
<tr>
<td><a href="{% url 'blog_add' %}">新增文章</a></td>
<td><a href="{% url 'blog_list' %}">文章列表</a></td>
</tr>
{% endblock %}
/templates/blog/demo_edit.py
{% extends 'blog/demo_base.html' %}{% block title %}
重新編輯部落格
{% endblock %}{% block bodyblock %}
<h1>重新編輯部落格</h1>
<form action="" method="POST">
{% csrf_token %}
標題<input type="text" autocomplete="off" id="title"
placeholder="請輸入標題" name='title' value={{ title2 }}>
<br> <br><br>
內容 <textarea name="content" id="content"
placeholder="請輸入內容" cols="30" rows="10">{{ content2 }}</textarea>
<button type="submit">釋出部落格</button>
</form>
{% endblock %}
t
9.接下來就是檢視函式的編寫
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
# 簡易部落格
from .models import BlogModel
# 部落格主頁
def index(request):
return render(request, 'blog/demo_index.html')
# 新增部落格
def add(request):
if request.method == 'GET':
return render(request,'blog/demo_add.html')
elif request.method == 'POST':
title = request.POST.get('title')
content = request.POST['content']
blog =BlogModel(title=title, content=content)
blog.save()
return redirect(reverse('blog_list'))
else:
return HttpResponse('不能處理的操作')
#部落格列表
def list(request):
blog_list = BlogModel.objects.all()
return render(request, 'blog/demo_list.html',
context={'blog_list':blog_list}
)
#文章詳情
def detail(request, blog_id):
# 通過id拿到當前的文章
blog = BlogModel.objects.get(id=blog_id) # 返回的是一共物件 get有兩個就不行了
# blog = BlogModel.objects.filter(id=blog_id) #返回的是QuerySet,在模板裡面使用blog.first.title拿到物件的屬性
return render(request, 'blog/demo_detail.html',
context={'blog':blog}
)
# 刪除文章
def delete(request, blog_id):
blog = BlogModel.objects.get(id=blog_id)
if blog:
blog.delete()
return redirect(reverse('blog_list'))
#編輯文章
def edit(request,blog_id):
if request.method == 'GET':
blog = BlogModel.objects.get(id= blog_id)
return render(request,'blog/demo_edit.html',
context={'title2':blog.title,
'content2':blog.content,
}
)
elif request.method == 'POST':
title = request.POST.get('title')
content = request.POST['content']
blog =BlogModel.objects.filter(id=blog_id)
# print(blog)
# blog =BlogModel.objects.get(id=blog_id)
# blog = BlogModel(title=title,content=content)
# blog.save() # 用get返回來的是一共物件,用屬性來修改
blog.update(title=title,content=content) # filter查出來的是QuerySet,有update方法
return redirect(reverse('blog_list'))
else:
return HttpResponse('修改文章出現未知錯誤!')
10.容易出現問題的幾個地方:
(1).url裡面的傳參與模板裡面的引數傳遞容易混亂,一定要搞清楚!
(2). 編寫檢視函式的時候,BolgModel.objects.filter
與BolgModel.objects.get
一定要分清,前者返回的是QuerySet型別的,後者返回的是一個物件。
剛起步,有不懂的地方或者要指正的地方還請大神要指出來。