1.创建项目library和应用程序
django-admin startproject library
cd library
python manage.py startapp books
2.创建模型
在 library/books/models.py 文件中创建模型
from django.db import modelsclass Book(models.Model):book_id = models.IntegerField(primary_key=True)name = models.CharField(max_length=100)author = models.CharField(max_length=100)publisher = models.CharField(max_length=100)publish_time = models.DateField()price = models.DecimalField(max_digits=8, decimal_places=2)create_time = models.DateTimeField(auto_now_add=True)update_time = models.DateTimeField(auto_now=True)def __str__(self):return self.name
3.迁移数据库
在终端中运行以下命令,将模型迁移到数据库中:
python3 manage.py migrate # 创建表结构
python3 manage.py makemigrations books # 让 Django 知道我们在我们的模型有一些变更
python3 manage.py migrate books # 创建表结构
修改settings.py
DATABASES = {'default':{'ENGINE': 'django.db.backends.mysql', # 数据库引擎'NAME': 'xxx', # 数据库名称'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1'PORT': 3306, # 端口'USER': 'root', # 数据库用户名'PASSWORD': 'xxxx', # 数据库密码}
}INSTALLED_APPS = ['books','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'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',],},},
]
4.创建表单
library/books/book_form.py
Django提供了两种自定义表单的方式:继承Form类和ModelForm类。前者你需要自定义表单中的字段,后者可以根据Django模型自动生成表单,如下所示:
from django import forms
from .models import Bookclass BookForm(forms.ModelForm):class Meta:model = Bookfields = ['name', 'author', 'publisher', 'publish_time', 'price', 'book_id']labels = {'name': '书名','author': '作者','publisher': '出版社','publish_time': '出版时间','price': '价格','book_id': '标识图书的唯一id'}widgets = {'publish_time': forms.DateInput(attrs={'type': 'date'})}
创建一个名为 BookForm 的 Django 表单类,它继承自 forms.ModelForm,用于创建和更新 Book 模型实例的表单。这个表单包含了模型中的各个字段,使用中文标签进行显示,并将 publish_time 字段的小部件渲染成日期选择器。
Meta 内部的各个属性设置如下:
model = Book 表示这个表单将与 Book 模型类相关联,用于创建和更新 Book 模型实例的表单。
fields = […] 定义了表单中需要显示的字段。在这个例子中,这些字段包括 name,author,publisher,publish_time,price 和 book_id。
labels = {…} 定义了表单中各个字段的标签,用于在表单中显示。这里将每个字段的标签名都指定为中文。
widgets = {…} 定义了表单中各个字段的小部件,用于在表单中显示。这里使用 forms.DateInput 来定义 publish_time 字段的小部件,将它渲染为 HTML5 中的日期选择器。
5.创建视图
在 library/books/views.py 文件中创建视图
from django.shortcuts import render, redirect
from .models import Book
from .book_form import BookFormdef book_list(request):books = Book.objects.all()return render(request, 'books/book_list.html', {'books': books})def book_detail(request, pk):book = Book.objects.get(pk=pk)return render(request, 'books/book_detail.html', {'book': book})def book_create(request):form = BookForm(request.POST or None)if form.is_valid():form.save()return redirect('book_list')return render(request, 'books/book_form.html', {'form': form})def book_update(request, pk):book = Book.objects.get(pk=pk)form = BookForm(request.POST or None, instance=book)if form.is_valid():form.save()return redirect('book_list')return render(request, 'books/book_form.html', {'form': form})def book_delete(request, pk):book = Book.objects.get(pk=pk)if request.method == 'POST':book.delete()return redirect('book_list')return render(request, 'books/book_delete.html', {'book': book})
6.创建 URL
在 library/library/urls.py 文件中创建 URL
from django.urls import path
import os
import sysfather_path = os.path.abspath(os.path.join(os.getcwd(), "..", "books"))
sys.path.append(father_path)
from books import views as lib_viewsurlpatterns = [# path('', views.index, name='index'),# path('signup/', views.signup, name='signup'),# path('login/', views.login, name='login'),# path('logout/', views.logout, name='logout'),path('books/', lib_views.book_list, name='book_list'),path('books/add/', lib_views.book_create, name='book_create'),path('books//', lib_views.book_detail, name='book_detail'),path('books//update/', lib_views.book_update, name='book_update'),path('books//delete/', lib_views.book_delete, name='book_delete'),
]
7.创建模板
在 templates/books/book_list.html 文件中创建模板
base.html
Library Management System
{% block content %}{% endblock %}
book_delete.html
{% extends 'books/base.html' %}{% block content %}Confirm Delete
Are you sure you want to delete "{{ book.name }}"?
{% endblock %}
book_detail.html
{% extends 'books/base.html' %}{% block content %}Book Detail
{{ book.name }}
Author: {{ book.author }}
Price: {{ book.price }}
Back to List
{% endblock %}
book_form.html
{% extends 'books/base.html' %}{% block content %}Add Book
{% endblock %}
book_list.html
{% extends 'books/base.html' %}{% block content %}
Book List
Add Book
Title Author Price Actions {% for book in books %}{{ book.name }} {{ book.author }} {{ book.price }} ViewEditDelete {% endfor %}
{% endblock %}
View
这行代码是一个 HTML 的链接元素,使用了 Django 模板语言的 URL 反解析功能。具体解释如下:
是 HTML 中的链接标签。
href 是链接的属性,它告诉浏览器要打开的页面地址。
{% url 'book_detail' book.pk %} 是 Django 模板语言的 URL 反解析语法。它会根据传递进来的 book 对象的主键 pk,解析出对应的 URL 地址。book_detail 是该 URL 地址对应的视图函数的名称,可以在 urls.py 文件中找到它的定义。这样做可以保证代码的可维护性和可扩展性。
View 是链接的文本内容,用户点击链接后会跳转到该链接地址。
因此,这行代码的作用是生成一个链接,指向 book_detail 视图函数对应的页面,并显示文本内容为 View
8.运行服务器
在终端中运行以下命令,启动服务器
python manager.py runserver 0.0.0.0:8000
在浏览器输入 127.0.0.0:8000就可以访问了