ModelForm组件
网课笔记
创建modelform类
from django import forms class MyModelForm(forms.ModelForm): class Meta: model = models.Book #一个models/py文件中的类(也就是一张表)对应一个modelform # fields = ['title',''] #选择你需要验证的字段 fields = '__all__' #选择所有字段 # exclude = ['title',] #排除某些字段 labels = { #注意写法 'title':'书名', 'price':'价格', } error_messages = { #定制错误信息 'title':{ 'required':'不能为空', 'max_length':'太长了', }, ... } widgets = { #字段定制插件 'publishDate':forms.widgets.DateInput(attrs={'type':'date'}), # 'publishDate2':forms.widgets.DateInput(attrs={'type':'date'}), } def clean_title(self): #局部钩子 val = self.cleaned_data.get('titile') return val def clean(self):pass 全局钩子 #照样可以重写init方法来进行批量操作 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields: self.fields[field].widget.attrs.update({ 'class': 'form-control', })
使用modelform类
——视图函数中
def edit_book(request,n): book_obj = models.Book.objects.filter(pk=n) if request.method == 'GET': book_obj = book_obj.first() form = MyModelForm(instance=book_obj) #实例化modelform对象,其中参数是你要求改的那个model对象,如果不加instance=book_obj就只生成标签,没有数据 return render(request,'edit_book.html',{'n':n,'form':form}) else: data = request.POST form = MyModelForm(data,instance=book_obj.first()) #如果没有写instance=这个参数,那么save方法会翻译成create,添加一个新的~~实际上我们想update修改!所以得加instance=book_obj if form.is_valid(): form.save() #update--book_obj.update(**data) return redirect('show') else: return render(request,'edit_book.html',{'form':form,'n':n})
前端渲染
{% for field in form %} <div class="form-group {% if field.errors.0 %} has-error {% endif %}"> <label for="{{ field.id_for_label }}"> {{ field.label }}</label> {{ field }} <span class="text-success">{{ field.help_text }}</span> <span class="text-danger">{{ field.errors.0 }}</span> </div> {% endfor %}