使用form组件对图书管理系统进行改进

会了form组建之后,我们可以把之前的图书管理系统使用form加上字段验证

我们只需要对views中的添加和修改逻辑进行修改 再添加form验证

  • form组件只能对添加新字段进行验证 不能对修改字段进行验证
    • 因为form组件不涉及读取数据 只是作为验证 修改字段需要携带value数据
  • views.py 部分代码展示
    from django import forms
    
    
    class BookFrom(forms.Form):
        title = forms.CharField(
            label="书名",
            max_length=32,
        )
        publishDate = forms.DateField(
            label="出版日期",
            widget=forms.widgets.TextInput(attrs={"type": "date"})
        )
        price = forms.DecimalField(
            label="价格",
            max_digits=5,
            decimal_places=2
        )
    
        # 一对多关系 方案一 写死了
        '''
        # publishs = forms.ForeignKey(to="Publish")
        publishs = forms.ChoiceField(
            label="出版社",
            choices=[
                (1, "滑稽出版社"),
                (2, "人民出版社"),
                (3, "垃圾出版社"),
            ],
            widget=forms.widgets.Select()
        )
        '''
        # 写活了
        publishs = forms.ModelChoiceField(
            label="出版社",
            queryset=models.Publish.objects.all()  # 获取一个queryset对象直接拿来生成choices使用
        )
    
        # 多对多关系 方案一
        '''
        # authors = forms.ManyToManyField(to='Author',) 
        authors = forms.MultipleChoiceField(
            label='作者',
            choices=[
                (1, "李二蛋"),
                (2, '王思丹'),
            ],
            widget=forms.widgets.SelectMultiple(),
        )
        '''
        authors = forms.ModelMultipleChoiceField(
            label='作者',
            queryset=models.Author.objects.all()
        )
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            for field in self.fields.values():  # self.fields 获取所有的字段
                field.widget.attrs.update(
                    {"class": "form-control"})  # 为获取到的字典对象添加属性
    
    # form只能对添加字段进行验证
    def addbooks(request):
        if request.method == 'GET':
            book_form_obj = BookFrom()
            return render(request, 'add_book.html', {
                'book_form_obj': book_form_obj,
            })
        if request.method == 'POST':
            print(request.POST)
            book_form_obj = BookFrom(request.POST)
            if book_form_obj.is_valid():
                print(book_form_obj.cleaned_data)
                # {'title': '屠龙勇士', 'publishDate': datetime.date(2020, 7, 10), 'price': Decimal('1'), 'publishs': <Publish: 人民出版社>, 'authors': <QuerySet [<Author: 李二蛋>]>}
                authors = book_form_obj.cleaned_data.pop("authors")
                new_book = models.Book.objects.create(
                    **book_form_obj.cleaned_data
                )
                new_book.authors.add(*authors) # 多对多可能传入多个做个 通过*打散传入多对多表
                return redirect('showbooks')
            else:
                return render(request, 'add_book.html', {
                    'book_form_obj': book_form_obj,
                })
        
        def editbooks(request, book_id):
            book_obj = models.Book.objects.filter(pk=book_id)
            if request.method == 'GET':
                
                # BookFrom({"key":value}) 接受的是这种值
                # 我们可以直接获取值发送给前端生成展示页面
                # 问题:多对多表和一对多表示queryset类型,key取值只能获取到字典
                # 无法实现(实现繁琐) 我们使用modelform组件实现
                book_form_obj = BookFrom(book_obj.values()[0])
        
                return render(request, 'edit_book.html', {
                    "book_form_obj":book_form_obj,
                    })

     

  • add_book.html
    <h1>添加书籍</h1>
    
    <div class="container">
      <div class="row">
        <div class="col-md-8 col-md-offset-2">
          <form action="" method="post" novalidate>
            {% csrf_token %}
            <div class="form-group">
              <label for="{{ book_form_obj.title.id_for_label }}">{{ book_form_obj.title.label }}</label>
              {{ book_form_obj.title }}
              <span style="color: crimson;font-size: 12px;">{{ book_form_obj.title.errors.0 }}</span>
            </div>
            <div class="form-group">
              <label for="{{ book_form_obj.price.id_for_label }}">{{ book_form_obj.price.label }}</label>
              {{ book_form_obj.price }}
              <span style="color: crimson;font-size: 12px;">{{ book_form_obj.title.errors.0 }}</span>
            </div>
            <div class="form-group">
              <label for="{{ book_form_obj.publishDate.id_for_label }}">{{ book_form_obj.publishDate.label }}</label>
              {{ book_form_obj.publishDate }}
              <span style="color: crimson;font-size: 12px;">{{ book_form_obj.title.errors.0 }}</span>
            </div>  
            <div class="form-group">
              <label for="{{ book_form_obj.publishs.id_for_label }}">{{ book_form_obj.publishs.label }}</label>
              {{ book_form_obj.publishs }}
              <span style="color: crimson;font-size: 12px;">{{ book_form_obj.title.errors.0 }}</span>
            </div>  
            <div class="form-group">
              <label for="{{ book_form_obj.authors.id_for_label }}">{{ book_form_obj.authors.label }}</label>
              {{ book_form_obj.authors }}
              <span style="color: crimson;font-size: 12px;">{{ book_form_obj.title.errors.0 }}</span>
            </div>
            <button class="btn btn-success pull-right">提交</button>
          </form>
    
        </div>
      </div>
    
    </div>

     

posted @ 2020-07-11 23:25  CatdeXin  阅读(223)  评论(0)    收藏  举报