zoukankan      html  css  js  c++  java
  • popUp

      popUp是啥?具体是啥我说不清,我理解为弹窗。你看看admin里面的 + 号。点击 + ,弹出的页面就是用popUp来实现的。

      在stack项目中,有用到。

      知识储备:

        - 自执行函数:  

         

       

    流程:(刚开始看绕的一批,后来再看,还是很绕...)

       首先肯定是要在添加页面或者编辑页面,你才可能会用到popUp。

       先进入到add_view.html,load会执行change_form,change_form用到了inclusion_tag。

       然后执行结果返回给form.html页面。其实也就是add页面了。

       点击popUp请求,执行function,根据反向查找,展示popUp页面。

       操作完成后,数据提交到add_views函数的post请求下面,会render一个 stark/popup_reponse.html

       该页面下,触发自执行函数,并将值返回原函数页面。执行该函数popupcallback下操作

       最后进行,正常的add操作。

       该操作同样适用于编辑操作。在编辑页面编写同样代码即可。

      

     1     def add_view(self,request,*args,**kwargs):
     2         model_form_class = self.get_model_form_class()
     3         _popbackid = request.GET.get('_popbackid')
     4         if request.method == "GET":
     5             form = model_form_class()
     6             return render(request,'stark/add_view.html',{'form':form,'config':self})
     7         else:
     8             form = model_form_class(request.POST)
     9             if form.is_valid():
    10                 # 数据库中创建数据
    11                 new_obj = form.save()
    12                 print('new_obj',str(new_obj))
    13                 if _popbackid:
    14                     # 是popup请求
    15                     # render一个页面,写自执行函数
    16                     # popUp('/stark/app01/userinfo/add/?_popbackid=id_consultant&model_name=customer&related_name=consultant')
    17 
    18                     from django.db.models.fields.reverse_related import ManyToOneRel, ManyToManyRel
    19                     result = {'status':False,'id':None,'text':None,'popbackid':_popbackid}
    20                     model_name = request.GET.get('model_name')     # 获得当前所在的类名 customer
    21                     related_name = request.GET.get('related_name') # 获得related_name  consultant                related_name = request.GET.get('related_name') #获得related_name
    22                     # print(model_name,related_name,new_obj._meta.model_name)   customer consultant userinfo
    23                     for related_obj in new_obj._meta.related_objects:
    24                         _model_name = related_obj.model._meta.model_name # 当前增加的表的名称
    25                         _related_name = related_obj.related_name         # 当前表关联的related_name
    26 
    27                         if type(related_obj) == ManyToOneRel:   # 判断如果是FK的话
    28                             _field_name = related_obj.field_name # code (to_field) 关联的字段
    29                         else:
    30                             _field_name = 'pk'
    31                         _limit_choices_to = related_obj.limit_choices_to
    32                         print('471_limit_choices_to',_limit_choices_to)
    33                         if model_name == _model_name and related_name == str(_related_name):
    34                             is_exists = self.model_class.objects.filter(**_limit_choices_to,pk=new_obj.id).exists()
    35                             if is_exists:
    36                                 # 如果是新创建用户是销售部的人, 页面才会显示该新增选项
    37                                 result['status'] = True
    38                                 result['text'] = str(new_obj)
    39                                 result['id'] = getattr(new_obj,_field_name)
    40                                 print(result)
    41                                 return render(request, 'stark/popup_response.html',{'json_result': json.dumps(result, ensure_ascii=False)})
    42                     # result = {'id':new_obj.pk, 'text':str(new_obj),'popbackid':_popbackid }
    43                     return render(request,'stark/popup_response.html',{'json_result':json.dumps(result,ensure_ascii=False)})
    44                 else:
    45                     return redirect(self.get_list_url())
    46             return render(request, 'stark/add_view.html', {'form': form,'config':self})
    add_view
    {% extends 'stark/layout.html' %}
    {% load change_form %}
    {% block body %}
       <h1>添加页面</h1>
        {% form config form  %}
    
    {% endblock %}
    
    我们去看一看{% load change_form %}里面是什么?
    add_view.html
    from django.template import Library
    from django.urls import reverse
    from stark.service.v1 import site
    
    register = Library()
    
    @register.inclusion_tag('stark/form.html')
    def form(config,model_form_obj):
        new_form = []
        for bfield in model_form_obj:
            temp = {'is_popup': False, 'item': bfield}
            # field是ModelForm读取对应的models.类,然后根据每一个数据库字段,生成Form的字段
            from django.forms.boundfield import BoundField
            from django.db.models.query import QuerySet
            from django.forms.models import ModelChoiceField
            if isinstance(bfield.field, ModelChoiceField):
                related_class_name = bfield.field.queryset.model
                if related_class_name in site._registry: # 如果已经被注册
                    app_model_name = related_class_name._meta.app_label, related_class_name._meta.model_name
    
                    # FK,M2M,O2O: 当前字段所在的类名,以及related_name
                    model_name = config.model_class._meta.model_name
                    related_name = config.model_class._meta.get_field(bfield.name).rel.related_name
                    # print('6666666666',model_name,related_name)
    
                    base_url = reverse("stark:%s_%s_add" % app_model_name)
                    # 这里生成的url在?后会带着它的当前类名和related_name
                    popurl = "%s?_popbackid=%s&model_name=%s&related_name=%s"%(base_url, bfield.auto_id,model_name,related_name)
                    temp['is_popup'] = True
                    temp['popup_url'] = popurl
            new_form.append(temp)
    
        return {'form':new_form}
    change_form
    stark/popup_response.html

            

    收工....

  • 相关阅读:
    Java接收Cordys中webservice接口的返回数据并解析xml获取相应节点数据
    初识jenkins之-jenkins的安装与配置
    Linux(centos6.8)下Tomcat的安装与配置
    [置顶] Linux下(centos6.8)JDK1.8的安装与配置
    小白五一期间个人建站
    声明一些事
    js中apply()的用法淺談
    angularJS中的服务
    PHP中的常用关键字
    PHP中三大特性---继承性
  • 原文地址:https://www.cnblogs.com/Wormhole-f/p/8229034.html
Copyright © 2011-2022 走看看