模拟admin组件自己开发stark组件之增删改查
增删改查,针对视图
我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写
app01下的joker.py文件
class BookModelForm(ModelForm): class Meta: model = models.Book fields = "__all__" error_messages={ "title":{"required":"该字段不能为空"} } widgets={ "pub_date":widgets.TextInput(attrs={"type":"date"}), } class bookjoker(joker.ModelAdmin): # 自定义样式类 list_display = ('id','title',) model_form_class = BookModelForm # 自己定制 form joker.site.register(models.Book,bookjoker)
样式类中判断类属性有没有用户自定义,没有就用自己的
model_form_class = None def get_model_form_class(self): if self.model_form_class: # 如果用户自己写了form,就走这里 return self.model_form_class else: # 用户没有自己创建form,那么我们执行默认的 from django.forms import ModelForm class model_form_class(ModelForm): # 我自己定义的验证,返回了地址 class Meta: model = self.model fields = '__all__' return model_form_class #===========================================增删改查视图 def add_view(self, request): # 基于form添加表单,需要判断输入情况了 model_form_class = self.get_model_form_class() if request.method == 'GET': form = model_form_class() # 实例化这个modelform验证 return render(request,'joker/add_view.html',locals()) else: form = model_form_class(request.POST) # 传来的是数据 if form.is_valid(): # 验证通过 form.save() # 加入数据库保存 return redirect(self.get_list_url()) # 返回查看页 else: return render(request,'joker/add_view.html',locals()) # 报错页面
def delete_view(self,request,id): if request.method=='GET': return render(request,'joker/delete_view.html') # 删除页面,给予提示删除 else: self.model.objects.filter(pk=id).delete() # 删除数据 return redirect(self.get_list_url()) def change_view(self,request,id): edit_obj = self.model.objects.filter(pk=id).first() # 拿到修改对象 if not edit_obj: # 因为有可能用户在url上手动输入错误 return redirect(self.get_list_url()) model_form_class = self.get_model_form_class() # if request.method == 'GET': form = model_form_class(instance=edit_obj) # 初始化数据 return render(request,'joker/change_view.html',locals()) else: form = model_form_class(request.POST,instance=edit_obj) # 针对谁做更新操作 if form.is_valid(): # 验证通过 form.save() # 更新 return redirect(self.get_list_url())
到这里主要效果实现:
我们来看下一些需要注意的地方
model_name = model._meta.model_name # 应用名称 app_label = model._meta.app_label # 表名 ###### 字符串,肯定就是字段了,例如 title字段到这里,就会得到verbose_name名字,如果没有verbose_name那就是本身名称 verbox_name = self.model._meta.get_field(field_name).verbose_name
field.label # 这是form里面,如果传来是对象,.label打印数据库字段,如果有verbose_name打印这个值
field.errors.0 # 错误信息