隐藏页面特效

图书管理系统---基于form组件和modelform改造添加和编辑

1|0添加 基于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')

2|0编辑 基于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})

__EOF__

本文作者404 Not Found
本文链接https://www.cnblogs.com/weiweivip666/p/13406654.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
posted @   我在路上回头看  阅读(228)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示