zoukankan      html  css  js  c++  java
  • 图书管理系统---基于form组件和modelform改造添加和编辑

    添加 基于form组件改造

    • 步骤1
          1.为了区分自己写的form类和视图逻辑,所以工作中需要区分开来,那么就可以在应用下创建一个叫utils的文件夹,专门存放我们写的form类,py文件名随便起
          2.在创建好py文件,如mymoforms.py文件中写上定义的模型类
          3.修改html页面
          4.编写逻辑
    

    • 自定义模型类代码 myforms.py
    from django import forms
    from app01 import models
    
    
    class BookForm(forms.Form):
        '''书籍数据校验类'''
        title = forms.CharField(
            label='书名',
            max_length=64,
            # widget=forms.TextInput(attrs={'class':'form-control'})
        )
        pub_date = forms.CharField(
            label='出版日期'
        )
        price = forms.DecimalField(
            label='价格',
            max_value=100,
            min_value=1,
            max_digits=10,
            decimal_places=2,
        )
        pub = forms.ModelChoiceField(
            label='出版社',
            queryset=models.Publish.objects.all(),
        )
        authors = forms.ModelMultipleChoiceField(
            label='作者',
            queryset=models.Author.objects.all()
        )
    
        #想在自己定义的forms类初始化的时候统一加一些样式
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            #给所有的类里面加上一个属性
            for name,field in self.fields.items():
                field.widget.attrs.update({'class':'form-control'})
    
    • add_book.html代码
          {% load static %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    </head>
    <body>
    
    
    <div class="container">
    
        <h1>添加书籍</h1>
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <form action="" method="post" novalidate>
                    {% for field in form %}
                    <div class="form-group">
                         <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                        {{ field }}
                        {{ field.errors.0 }}
                    </div>
                    {% endfor %}
                    <button class="btn btn-success pull-right">提交</button>
                </form>
    
    
            </div>
    
        </div>
    
    
    </div>
    
    
    </body>
    
    </html>
    
    • 视图逻辑
          def add_book(request):
        if request.method == 'GET':
            #实例化form类
            form = BookForm()
            return render(request, 'add_book.html', {'form':form})
    
        elif request.method == 'POST':
            print(request.POST)
            #实例化一个对象
            form = BookForm(data=request.POST)
            if form.is_valid():
                print(form.cleaned_data) #校验的时候会根据id查找得到对象
                #{'title': '小雪', 'pub_date': '2020-02-04', 'price': Decimal('12.5'), 'pub': <Publish: 一本道出版社>, 'authors': <QuerySet [<Author: 王振>, <Author: 刘伟>]>}
                authors_objs = form.cleaned_data.pop('authors')
                book_obj = models.Book.objects.create(
                        **form.cleaned_data#直接用打散的方式,正好pub这个属性对应的是对象,如果是列名pub_id则需要对应具体的id值
                )
                book_obj.authors.add(*authors_objs) #添加作者关系
                #上面这三步,可以直接用一个 form.save()方法就可以了
                return redirect('book_list')
    

    编辑 基于modelform组件改造

    • 自定义的模型类
          class BookModelForm(forms.ModelForm):
    
    
        class Meta:  #为上面这个类做一些原信息配置
            model = models.Book  #指定模型类
            fields = '__all__'  #指定Book模型类中的所有属性
            '''
            modelform会自动将这些属性转换为跟上面BookForm类中定义的属性一样
            Book类里面的 pub = models.ForeignKey('Publish'),authors = models.ManyToManyField('Author')
            会自动翻译成如下
            pub = forms.ModelChoiceField(
            label='出版社',
            queryset=models.Publish.objects.all(),
            )
            authors = forms.ModelMultipleChoiceField(
                label='作者',
                queryset=models.Author.objects.all()
            )
            '''
            labels={
                'title':'书籍名称',
                'pub':'出版社',
                'price':'价格',
                'pub_date':'出版日期',
                'authors':'作者',
            }
            error_messages={
                'title':{'required':'不能为空','max_length':'太长了,受不了'},
                'price':{'required':'不能为空',}
            }
    
        # 想在自己定义的forms类初始化的时候统一加一些样式
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # 给所有的类里面加上一个属性
            for name, field in self.fields.items():
                field.widget.attrs.update({'class': 'form-control'})
    
    
    • edit_book.html文件
          {% load static %}
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    </head>
    <body>
    
    
    <div class="container">
    
        <h1>编辑书籍</h1>
        <div class="row">
            <div class="col-md-8 col-md-offset-2" >
                <!-- 不传路径,默认就是当前路径 -->
                <form action="" method="post" novalidate>
                    {% for field in form %}
                    <div class="form-group  {% if field.errors.0 %}has-error{% endif %}">
                        <label  class="control-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                        {{ field }}
                        <span class="text-danger">{{ field.errors.0 }}</span>
                    </div>
                    {% endfor %}
    
                    <button class="btn btn-success pull-right">提交</button>
                </form>
    
    
            </div>
    
        </div>
    
    
    </div>
    
    
    </body>
    
    </html>
    
    • 视图逻辑
          #基于modleform来做编辑 先引入自己定义的modelform这个类
    def edit_book(request,pk):
        if request.method == 'GET':
            old_book_obj = models.Book.objects.get(pk=pk)
            # 想获取页面的时候,输入框中显示这条数据的原始记录必须用instance
            #如果不传instance,那么就是一个添加页面的效果,也就是生成标签没有默认值
            #作用是找寻给出的这个对象的所有属性记录值然后自动添加initial属性初始值
            form = BookModelForm(instance=old_book_obj)
            return render(request,'edit_book.html',{'form':form})
    
        elif request.method == 'POST':
            old_book_obj = models.Book.objects.get(pk=pk)
            #如果没有传instance就是添加的效果,传了的话就是编辑
            form = BookModelForm(data=request.POST,instance=old_book_obj)
            if form.is_valid():  #进行校验
                '''
                authors_objs = form.cleaned_data.pop('authors')
                book_obj = models.Book.objects.create(
                        **form.cleaned_data#直接用打散的方式,正好pub这个属性对应的是对象,如果是列名pub_id则需要对应具体的id值
                )
                book_obj.authors.add(*authors_objs) #添加作者关系
                '''
                #save()方法相当于就是做了上面三件事
                form.save()  #数据校验全部通过后,保存编辑,前提是instance=old_book_obj这个参数要添加,否则那就是添加一条数据了,而不是修改
                return redirect('book_list')
            else:
                return render(request, 'edit_book.html', {'form': form})
    

    -------------------------------------------

    个性签名:代码过万,键盘敲烂!!!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    排序算法说明
    easyExcel 读写excel表格
    POI 读写excel表格
    JVM虚拟机详解
    SSM相关的配置文件模板
    SSM 统一异常处理
    ssm框架实现发送邮件
    springboot发送邮件
    SpringBoot Ajax请求Json数据
    协程(Coroutine)(二)
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13406654.html
Copyright © 2011-2022 走看看