在上周經過了Django的學習後,(沒看到可以點擊此處)深入理解一個框架的意義就是直接使用其來進行開發。這裡以簡單的圖書管理系統為例。其中,前端使用的是比較流行的Bootstrap4框架,數據庫由於便捷性使用的是雲服務的數據庫,比較好移植運行
本次從前端到後端業務邏輯部分,可謂是web開發的全部工作了。掌握這篇相信你對web開發有足夠的認識了。同時幾小時就可以建造自己的網站了!
關於代碼部分可以私信博主獲得,由於篇幅原因就不再貼前端代碼了。增刪改查部分都基本一致,主要也是鞏固ORM模型代碼書寫,做到熟練。當然,編寫與運行中仍然會遇到種種問題,相信大家可以通過搜索問題,或者評論留言爭取把這個簡易的管理搞懂吧!
本地環境 python 3.7.9. Pycharm 2022 Django 3.2 Mysql 5.7 Bootstrap4
關於項目部署將單獨做一期,另外項目源碼可私信博主獲取。
本次圖書管理系統,分為三個管理系統端,分別是出版社信息,作者信息,圖書信息管理。同時有登錄和注冊界面。
數據庫實體設計:
出版社(出版社編號,出版社地址,出版社名稱)
圖書(序號,圖書名稱,圖書編號,譯者,出版日期,出版社)
譯者(序號,姓名,性別,年齡,聯系方式)
作者(序號,用戶名,密碼,郵箱,手機)
這是本次項目的全部文件概覽。可以看到結構是比較清晰的,app01就是app部分(視圖),bms就是配置部分(路由),static使用的是前端框架bootstrap4,templates是前端頁面。運行入口是manage.py。在test.py部分是測試部分或者是一些腳本工作區。
部分運行截圖:
新建空項目,並在終端輸入
django-admin startproject bms
在數據庫中創建數據庫library
create database library
在settings.py配置數據庫相關設置
# 默認初始:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
需要修改:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'library', # 數據庫名稱
'HOST': '**********', # 服務器地址,如果是本地可以寫127.0.0.1
'PORT': 3306,
'USER':'root',
'PASSWORD':'[email protected]',
}
}
在/bms/init.py文件下:
import pymysql
pymysql.install_as_MySQLdb()
以上初始化工作已經完成
模型使用自帶的ORM,在業務層與數據庫層充當了橋梁的作用。ORM將python代碼轉換成sql語句,sql語句通過pymysql傳到服務器數據庫中,數據庫執行SQL語句。
django規定,如果要使用模型,必須要創建一個app,使用以下命令創建app01的app
python3 manage.py startapp app01
目前現在的文件夾工區:
同時在/bms/settings.py中installed_apps添加app01
現在定義模型了。
之前已經創建一個library數據庫了,現在用python來進行sql語句創建。
注意django對模型和目標數據庫有映射關系,如果在自己的數據庫建表會存在不一定符合django規則,從而導致模型與目標數據庫無法連接。下面在app01/models.py創建關於表的內容
from django.db import models
# Create your models here.
# 出版社類
class Publisher(models.Model):
id = models.AutoField('序號',primary_key=True)
name = models.CharField('名稱',max_length=64)
addr = models.CharField('地址',max_length=64)
# 書籍類
class Book(models.Model):
id = models.AutoField('序號',primary_key=True)
name = models.CharField('名稱',max_length=64,null=True)
ISBN = models.CharField('編號',max_length=64)
translator = models.CharField('譯者',max_length=64)
translator = models.CharField('譯者', max_length=64)
date = models.DateField('出版日期', max_length=64, blank=True)
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)
# 作者的類
class Author(models.Model):
id = models.AutoField('序號', primary_key=True)
name = models.CharField('姓名', max_length=64)
sex = models.CharField('性別', max_length=4)
age = models.IntegerField('年齡', default=0)
# Django 中創建外鍵聯表操作
tel = models.CharField('聯系方式', max_length=64)
# 一個作者可以對應多本書,一本書也可以有多個作者,多對多,在數據庫中創建第三張表
book = models.ManyToManyField(to=Book)
# 用戶的類
class LmsUser(models.Model):
id = models.AutoField('序號', primary_key=True)
username = models.CharField('用戶名', max_length=32)
password = models.CharField('密碼', max_length=32)
email = models.EmailField('郵箱')
mobile = models.IntegerField('手機', max_length=11)
下面使用命令使得命令創建表的內容:
python manage.py migrate
看到如下界面表示運行成功了,如果沒有成功,請關注pymysql,mysql-connector模塊安裝,當然注意init.py文件下的操作(見上)
終端輸入:
python manage.py makemigrations app01
python manage.py migrate app01
在pycharm專業版中的數據庫下面,可以看到library已經創建了如下表。
前端框架選用Bootstrap4,它是基於Html css javascript,使得web開發快捷。
在項目根目錄下新建一個static,用於存放前端模版靜態資源,同時將前端資源導入。同時新建templates,用於存放前
這是目前的前端框架文件。
打開/bms/settings.py 修改django識別靜態資源和模版網頁地址,找到templates配置修改為用於識別模版網頁網址。
'DIRS': [os.path.join(BASE_DIR,'templates')], # 只要添加dirs這一項就可以了。
在static_url下面添加:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), # 添加此項
]
在app01/views.py創建出版社視圖
from django.shortcuts import render
import models
# Create your views here.
# 出版社展示列表
def publisher_list(request):
publisher = models.Publisher.objects.all()
return render(request,'pub_list.html',{
'pub_list':publisher})
在urls.py配置路由信息
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from ..app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^pub_list/',views.publisher_list)
]
在templates/pub_list.html中寫入前端代碼:
(前端代碼就不放這裡了)
/app01/views.py
新增出版社視圖
# 添加出版社
def add_publisher(request):
if request.method == 'POST':
new_publisher_name = request.POST.get('name')
new_publisher_addr = request.POST.get('addr')
models.Publisher.objects.create(name=new_publisher_name,addr=new_publisher_addr)
return redirect('/pub_list/')
return render(request,'pub_add.html')
修改urls.py映射關系
url(r'^add_pub/',views.add_publisher)
在/templates/pub_add.html新增前端代碼:
前端代碼就不給了,比較多。
創建修改出版社視圖函數
views.py
def edit_publisher(request):
if request.method == 'POST':
edit_id = request.GET.get('id')
edit_obj = models.Publisher.objects.get(id=edit_id)
new_name = request.POST.get('edit_name')
new_addr = request.POST.get('edit_addr')
edit_obj.name=new_name
edit_obj.addr=new_addr
edit_obj.save()
return redirect('/pub_list/')
edit_id = request.GET.get('id')
edit_obj = models.Publisher.objects.get(id=edit_id)
return render(request,'pub_edit.html',{
'publisher':edit_obj})
urls.py
url(r'^edit_pub/',views.edit_publisher),
templates/pub_edit.html
views.py
#刪除出版社
def drop_publisher(request):
drop_id = request.GET.get('id')
drop_obj = models.Publisher.objects.get(id=drop_id)
drop_obj.delete()
return redirect('/pub_list/')
urls.py
url(r'^drop_pub/', views.drop_publisher),
views.py
# 添加作者
def add_author(request):
if request.method == 'POST':
new_author_name = request.POST.get('name')
new_author_sex = request.POST.get('sex')
new_author_age = request.POST.get('age')
new_author_tel = request.POST.get('tel')
models.Author.objects.create(name=new_author_name, sex=new_author_sex, age=new_author_age, tel=new_author_tel)
return redirect('/author_list/')
return render(request, 'author_add.html')
# 刪除作者
def drop_author(request):
drop_id = request.GET.get('id')
drop_obj = models.Author.objects.get(id=drop_id)
drop_obj.delete()
return redirect('/author_list/')
# 修改作者
def edit_author(request):
if request.method == 'POST':
edit_id = request.GET.get('id')
edit_obj = models.Author.objects.get(id=edit_id)
new_author_name = request.POST.get('edit_name')
new_author_sex = request.POST.get('edit_sex')
new_author_age = request.POST.get('edit_age')
new_author_tel = request.POST.get('edit_tel')
new_book_id = request.POST.getlist('book_id')
edit_obj.name = new_author_name
edit_obj.sex = new_author_sex
edit_obj.age = new_author_age
edit_obj.tel= new_author_tel
edit_obj.book.set(new_book_id)
edit_obj.save()
return redirect('/author_list/')
edit_id = request.GET.get('id')
edit_obj = models.Author.objects.get(id=edit_id)
all_book = models.Book.objects.all()
return render(request, 'auth_edit.html', {
'author': edit_obj,
'book_list': all_book
})
urls.py
url(r'^author_list/', views.author_list), # 作者列表
url(r'^add_author/', views.add_author), # 新增作者
url(r'^drop_author/', views.drop_author), # 刪除作者
url(r'^edit_author/', views.edit_author), # 編輯作者
views.py
# 書籍列表
def book_list(request):
book = models.Book.objects.all()
return render(request, 'book_list.html', {
'book_list': book})
# 添加書籍
def add_book(request):
if request.method == 'POST':
new_book_name = request.POST.get('name')
new_book_ISBN = request.POST.get('ISBN')
new_book_translator = request.POST.get('translator')
new_book_date = request.POST.get('date')
publisher_id = request.POST.get('publisher_id')
models.Book.objects.create(name=new_book_name, publisher_id=publisher_id, ISBN=new_book_ISBN,
translator=new_book_translator, date=new_book_date)
return redirect('/book_list/')
res = models.Publisher.objects.all()
return render(request, 'book_add.html', {
'publisher_list': res})
# 刪除書籍
def drop_book(request):
drop_id = request.GET.get('id')
drop_obj = models.Book.objects.get(id=drop_id)
drop_obj.delete()
return redirect('/book_list/')
# 編輯書籍
def edit_book(request):
if request.method == 'POST':
new_book_name = request.POST.get('name')
new_book_ISBN = request.POST.get('ISBN')
new_book_translator = request.POST.get('translator')
new_book_date = request.POST.get('date')
new_publisher_id = request.POST.get('publisher_id')
edit_id = request.GET.get('id')
edit_obj = models.Book.objects.get(id=edit_id)
edit_obj.name = new_book_name
edit_obj.ISBN = new_book_ISBN
edit_obj.translator = new_book_translator
edit_obj.date = new_book_date
edit_obj.publisher_id = new_publisher_id
edit_obj.save()
return redirect('/book_list/')
edit_id = request.GET.get('id')
edit_obj = models.Book.objects.get(id=edit_id)
all_publisher = models.Publisher.objects.all()
return render(request, 'book_edit.html', {
'book': edit_obj, 'publisher_list': all_publisher})
urls.py
url(r'^book_list/', views.book_list), # 圖書列表
url(r'^add_book/', views.add_book), # 新增圖書
url(r'^drop_book/', views.drop_book), # 刪除圖書
url(r'^edit_book/', views.edit_book), # 編輯圖書
密碼使用的是md5加密, 這裡是密碼沒有進行明文保存的,一般來說,目前都是使用這種的密碼保護。
views.py
# 密碼加密 md5加密
def setPassword(password):
md5 = hashlib.md5()
md5.update(password.encode())
password = md5.hexdigest()
return str(password)
# 登錄
def login(request):
if request.method == 'POST' and request.POST:
email = request.POST.get("email")
password = request.POST.get("password")
e = LmsUser.objects.filter(email=email).first()
if e:
now_password = setPassword(password)
db_password = e.password
if now_password == db_password:
reponse = HttpResponseRedirect('/pub_list/')
reponse.set_cookie("username",e.username)
return reponse
return render(request,"login.html")
# 注冊
def register(request):
if request.method == "POST" and request.POST:
data = request.POST
username = data.get("username")
email = data.get("email")
password= data.get("password")
mobile = data.get("mobile")
LmsUser.objects.create(
username = username,
email = email,
password = setPassword(password),
mobile = mobile,
)
return HttpResponseRedirect('/login/')
return render(request,"register.html")
urls.py
url(r'^login/', views.login), # 登錄動作
url(r'^signup/', views.register), # 注冊頁面
url(r'^register/', views.register), # 注冊
以上基於django的圖書管理系統的業務部分已經全部完成了,關於前端代碼有需要的私信聯系。
希望有所收獲哦!