图书管理系统基于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})
复制代码

 

posted @ 2018-11-07 20:25  RootEvils  阅读(103)  评论(0)    收藏  举报