图书管理系统基于modleforms实现
项目实施:
1:数据库表结构:
models
1 from django.db import models
2
3 # Create your models here.
4
5 class Book(models.Model):
6 nid=models.AutoField(primary_key=True)
7 title=models.CharField(max_length=32)
8 price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
9 pub_date=models.DateTimeField() # "2012-12-12"
10
11 publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE) # 级联删除
12 authors=models.ManyToManyField(to="Author")
13 def __str__(self):
14 return self.title
15
16
17 class Publish(models.Model):
18 nid = models.AutoField(primary_key=True)
19 name=models.CharField(max_length=32)
20 email=models.CharField(max_length=32)
21 def __str__(self):
22 return self.name
23
24 class Author(models.Model):
25 nid = models.AutoField(primary_key=True)
26 name=models.CharField(max_length=32)
27 age=models.IntegerField()
28 email=models.CharField(max_length=32)
29 ad=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
30 #books=models.ManyToManyField("Book")
31 def __str__(self):
32 return self.name
2:定义modelforms组件类:
from django import forms
from app01.models import Book,Author,Publish
from django.forms import widgets as wid
class BookModelForm(forms.ModelForm):
# Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性
class Meta: #元类
model=Book
fields="__all__"
# fields=["title","price","pub_date"]
# exclude=["title"]
labels={
"title":"书籍名称",
"price":"价格"
},
error_messages={
"title":{"required":"不能为空"}
},
widgets={
"pub_date":wid.TextInput(attrs={"type":"date"})
}
def clean_price(self):
# 定义局部钩子
pass
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for filed in self.fields.values():
#filed.error_messages={"required":"不能为空"}
filed.widget.attrs.update({'class': 'form-control'})
3:前端页面
<body>
<h3>添加书籍</h3>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
{% include 'form.html' %}
</div>
</div>
</div>
</body>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" value="提交" class="btn btn-default pull-right">
</form>
4:视图函数--增加书籍
访问增加书籍页面填写数据提交
def book_add(request):
if request.method=="GET":
form=BookModelForm()
return render(request,"book_add.html",{"form":form})
else:
form=BookModelForm(request.POST)
if form.is_valid(): #校验数据通过
# 因为author和book两张表有关联关系,我们的想法是先把关联字段拿出来,其他字段先添加到数据库中,
# 然后在把关联字段添加
# authors=form.cleaned_data.pop("authors") #清除关联字段
# book = Book.objects.create(**form.cleaned_data) #把数据写入数据库
# book.authors.add(*authors) #关联字段添加进入
obj=form.save() # create #这个save是modelform组件的API,相当于上面的3句话,往数据库添加数据
return redirect("/books/")
else: #未通过校验的数据渲染到前端页面上
return render(request, "book_add.html", {"form": form})
编辑书籍
def book_edit(request,edit_book_id):
edit_book = Book.objects.filter(pk=edit_book_id).first() #获取数据库中的相应数据
if request.method=="GET":
form=BookModelForm(instance=edit_book) #编辑页面也需要显示原来的信息
return render(request,"book_edit.html",{"form":form})
else:
form=BookModelForm(request.POST,instance=edit_book)
if form.is_valid(): #校验数据
form.save() # update操作 ; edit_book.update(**cleandata)
return redirect("/books/")
else:
return render(request, "book_edit.html", {"form": form})
编辑添加的伪代码
逻辑:
添加书籍:
def add(reqeust):
if GET请求:
form=BookModelForm()
return render(reqeust,{"form":form})
'''
渲染页面
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" value="提交" class="btn btn-default pull-right">
</form>
'''
else POST请求:
form=BookModelForm(request.POST)
if form.is_valid():
form.save() # Book.objects.create(clean_data)
return redirect("/")
else:
return render(reqeust,{"form":form})
编辑书籍:
def edit(request,id):
edit_obj=Book.objects.get(pk=id)
if GET请求:
form=BookModelForm(instance=edit_obj)
return render(reqeust,{"form":form})
'''
渲染页面同添加页面
'''
else POST请求:
form=BookModelForm(request.POST,instance=edit_obj)
if form.is_valid():
form.save() # edit_obj.update(clean_data)
return redirect("/")
else:
return render(reqeust,{"form":form})


浙公网安备 33010602011771号