zoukankan      html  css  js  c++  java
  • 模拟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 # 错误信息
  • 相关阅读:
    kafka 生产者消费者 api接口
    湖南省第九届大学生计算机程序设计竞赛 Interesting Calculator
    Debugger DataSet 调试时查看DataSet
    DELPHI 常用虚拟键:VK_
    DBGRID控件里可以实现SHIFT复选吗?怎么设置?
    在dbgrid中如何多行选中记录(ctl与shift均可用)
    如何在DBGrid里实现Shift+“选择行”区间多选的功能!
    按着shift键对dbgrid进行多条记录选择的问题(50分)
    Delphi实现DBGrid Shift+鼠标左键单击 多选
    Delphi定位TDataSet数据集最后一条记录
  • 原文地址:https://www.cnblogs.com/jokerbj/p/8390570.html
Copyright © 2011-2022 走看看