python curd设计

本文介绍了一个基于Django框架的自定义ORM操作封装方案,通过创建StackConf类来简化数据库表的操作,包括列表显示、增删改查等功能,并展示了如何在具体应用中注册和使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在django项目中创建stack app,创建service package ,在其中创建v1.py

from django.shortcuts import HttpResponse,render,redirect
from django.urls import reverse
from django.urls import path,re_path
from django.forms import ModelForm
class StackConf(object):
    '''
    用于封装单独操作数据库的类
    '''
    list_display=[]
    model_form_cls=None
    def __init__(self,mcls):
        self.mcls=mcls

    @property
    def urls(self):
        app_model_name=(self.mcls._meta.app_label,self.mcls._meta.model_name)
        patterns=[
            path('',self.changelist_view,name='%s_%s_changelist'%(app_model_name)),
            path('add',self.add_view,name='%s_%s_add'%(app_model_name)),
            re_path('(\d+)/change/',self.change_view,name='%s_%s_change'%(app_model_name)),
            re_path('(\d+)/delete/',self.delete_view,name='%s_%s_delete'%(app_model_name)),
        ]
        patterns.extend(self.extend_urls())
        return patterns
    def extend_urls(self):
        '''
        钩子函数
        :return:
        '''
        ext_urls=[]
        return ext_urls

    def get_model_form_cls(self):
        if self.model_form_cls:
            return self.model_form_cls
        class TempModelForm(ModelForm):
            class Meta:
                model=self.mcls
                fields="__all__"
        return TempModelForm

    def changelist_view(self,request):
        mcls_dict = self.mcls.objects.all()
        #处理表头
        head_list=[]
        for item in self.list_display:
            temp=self.mcls._meta.get_field(item).verbose_name
            head_list.append(temp)
        #处理表内容
        body_list=[]
        for body_item in mcls_dict:
            body_temp=[]
            for n in self.list_display:
                body_temp.append(getattr(body_item,n))
            body_list.append(body_temp)
        #处理添加按钮
        app_model_name = (self.mcls._meta.app_label, self.mcls._meta.model_name,)
        name = "stack:%s_%s_add" % app_model_name
        add_url=reverse(name)
        #return HttpResponse('列表页面')
        return  render(request,'list.html',{'head_list':head_list,'body_list':body_list,"add_url":add_url})

    def add_view(self,request):
        model_form_class=self.get_model_form_cls()
        if request.method=='GET':
            form=model_form_class()
            return render(request,'add_view.html',{'form':form})
        else:
            form=model_form_class(request.POST)
            if form.is_valid():
                form.save()
                #跳转到列表页面
                app_model_name = (self.mcls._meta.app_label, self.mcls._meta.model_name,)
                name='stack:%s_%s_changelist' %app_model_name
                list_url=reverse(name)
                return redirect(list_url)
            return render(request,'add_view.html',{'form':form})
        #return HttpResponse('添加页面')

    def change_view(self,request,id):
        return HttpResponse('更新页面')

    def delete_view(self,request,id):
        return HttpResponse('删除页面')
class StackSite(object):
    '''
    用于封装所有数据库操作的类
    '''
    def __init__(self):
        self._registry={}
    def register(self,model_class,conf_cls=None):
        if not conf_cls:
           conf_cls=StackConf
        self._registry[model_class]=conf_cls(model_class)

    @property
    def urls(self):
        ptl=[
            path('login/',self.login),
        ]
        for model_class,config_obj in self._registry.items():
            app_label=model_class._meta.app_label
            model_name=model_class._meta.model_name
            tmp=path('%s/%s/'%(app_label,model_name),(config_obj.urls,None,None))
            #tmp = path('%s/%s/' % (app_label, model_name),self.login)
            ptl.append(tmp)
        return ptl,'stack',None
    def login(self,request):
        return HttpResponse('登录页面')
site=StackSite()

在django项目中创建测试 app   

  app01,创建stack.py   注册 app01中的models.py中的数据库表到 stack app 中

# print('sakula,this is stack.')
from app01 import  models
from stack.service import  v1
from stack.service.v1 import site
from django.shortcuts import render
from django.urls import path
from django.forms import ModelForm
from django.forms import fields
class UserInfoModelForm(ModelForm):
    xx=fields.CharField(max_length=32)
    class Meta:
        model=models.UserInfo
        fields="__all__"
class UserInfoConf(v1.StackConf):
    model_form_cls = UserInfoModelForm
    list_display = ['id','username','password']
    # def changelist_view(self,request):
    #     mcls_dict=self.mcls.objects.all()
    #     #return HttpResponse('列表页面')
    #     return  render(request,'list_conf.html',{'result_list':mcls_dict})

#实现钩子函数 完成 url页面的扩展
class RoleConf(v1.StackConf):
    #数据的展示自定义
    list_display = ['id','title']
    def extend_urls(self):
        patterns=[
            path('xxx',self.xxx),
        ]
        return patterns
    def xxx(self,request):
        return render(request,'xxx.html')
site.register(models.UserInfo,UserInfoConf)
site.register(models.Role,RoleConf)

在django项目中 urls.py 中 配置url的访问入口

"""my2_curd URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from stack.service import v1
urlpatterns = [
    path('admin/', admin.site.urls),
    path('stack/',v1.site.urls,),
]

 

转载于:https://www.cnblogs.com/hexintong/p/9571059.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值