模拟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 # 错误信息