随笔 - 911  文章 - 5  评论 - 94  阅读 - 243万

通用视图-分开处理GET、POST请求

1.编辑urls.py:

    url(r'^vmmgmt-vms/$', views.vmmgmt,{'model':models.hvvms,'GET': views.vmmgmt_get_view,'POST': views.vmmgmt_post_view},name='vmmgmt-vms'), #vmmgmt view接收model,GET,POST参数
    url(r'^vmmgmt-hv/$', views.vmmgmt,{'model':models.hvsrvs,'GET': views.vmmgmt_get_view,'POST': views.vmmgmt_post_view},name='vmmgmt-hv'),
    url(r'^vmmgmt-vhd/$', views.vmmgmt,{'model':models.hvvhds,'GET': views.vmmgmt_get_view,'POST': views.vmmgmt_post_view},name='vmmgmt-vhd'),

2.编辑views.py:

复制代码
#split get and post requests.
def vmmgmt(request,*args,**kwargs): #从url接收参数,用于区分GET、POST请求
    vmmgmt_get_view = kwargs.pop('GET', None) #return None if GET not exists.
    vmmgmt_post_view = kwargs.pop('POST', None)
    model = kwargs.pop('model', None) #获取当前model
    if request.method == 'GET' and vmmgmt_get_view is not None: #GET请求返回到vmmgmt_get_view()函数进行处理
        return vmmgmt_get_view(request, model) #将model传递到get view
    elif request.method == 'POST' and vmmgmt_post_view is not None:
        return vmmgmt_post_view(request, model)
        #return vmmgmt_post_view(request, *args, **kwargs)
    raise Http404

#handle get request.
def vmmgmt_get_view(request,model):
    obj_list = model.objects.all()  #从url中的 model 参数接收到具体的model类。模板中要使用 obj_list 变量做for循环
    counts = model.objects.count()
    assert request.method == 'GET'
    if 'q-hv' in request.GET:
            qdata = request.GET['q-hv']
            if qdata is not None:
                obj_list = model.objects.filter(serverip__icontains=qdata)
                counts = len(obj_list)

    if 'q-vms' in request.GET: #Query vm infors.
        qdata = request.GET['q-vms']
        if qdata is not None:
            obj_list = model.objects.filter(Name__icontains=qdata)
            print obj_list
            counts = len(obj_list)

    context={'obj_list':obj_list,'counts':counts}
    template_name = 'sinfors/vmmgmt_%s.html'  % model.__name__.lower()  # 每个Python的类都有一个 __name__ 属性返回类名。 这特性在当我们直到运行时刻才知道对象类型的这种情况下很有用。 比如, hvvms 类的 __name__ 就是字符串 'hvvms' 。
    #return render_to_response(template_name,context) #无法接收csrfmiddretoken参数
    return render(request,template_name,context)

#handle post request.
def vmmgmt_post_view(request,model):
    assert request.method == 'POST'
    if request.POST['posttype'].strip() == 'hvservers_update_create': #update hv servers infors.
            sdict = {}
            sdict['serverip'] = request.POST['serverip'].strip()
            sdict['servername'] = request.POST['servername'].strip()
            model.objects.update_or_create(serverip=sdict['serverip'],defaults=sdict)
            return HttpResponse(json.dumps({'sts':"修改成功"}))

    if request.POST['posttype'].strip() == 'vhds_update_create': #update vhd servers infors.
        sdict = {}
        sdict['vhdname'] = request.POST['vhdname'].strip()
        sdict['vhdpath'] = request.POST['vhdpath'].strip()
        model.objects.update_or_create(vhdname=sdict['vhdname'],defaults=sdict)
        return HttpResponse(json.dumps({'sts':"修改成功"}))

    if request.POST['posttype'].strip() == 'del': #delete infors.
        datas_del = request.POST.getlist('datas_del')
        for i in datas_del:
            item = model.objects.get(pk=i)
            time.sleep(0.1)
            item.delete()
        return HttpResponse(json.dumps({'sts':"删除成功"}))
        
    context={'obj_list':obj_list,'counts':counts}
    template_name = 'sinfors/vmmgmt_%s.html'  % model.__name__.lower()  # 每个Python的类都有一个 __name__ 属性返回类名。 这特性在当我们直到运行时刻才知道对象类型的这种情况下很有用。 比如, hvvms 类的 __name__ 就是字符串 'hvvms' 。
    #return render_to_response(template_name,context) #无法接收csrfmiddretoken参数
    return render(request,template_name,context)
复制代码

参考:http://djangobook.py3k.cn/2.0/chapter08/  method_splitter(request, *args, **kwargs)

 

posted on   momingliu11  阅读(713)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示