java中的接口是类吗
299
2022-08-29
图书管理系统---基于form组件和modelform改造添加和编辑
添加 基于form组件改造
步骤1
1.为了区分自己写的form类和视图逻辑,所以工作中需要区分开来,那么就可以在应用下创建一个叫utils的文件夹,专门存放我们写的form类,py文件名随便起 2.在创建好py文件,如mymoforms.py文件中写上定义的模型类 3.修改html页面 4.编写逻辑
自定义模型类代码 myforms.py
from django import formsfrom app01 import modelsclass 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 %}
视图逻辑
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':
编辑 基于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 %}
视图逻辑
#基于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})
-------------------------------------------
个性签名:代码过万,键盘敲烂!!!
如果觉得这篇文章对你有小小的帮助的话,记得“推荐”哦,博主在此感谢!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~