7.27-8.2 JLL实习日志-Ajax +Restful+Api+Variable参数

实现 的功能 :在 Django 内 使用 ajax 的 方式 调用 Restful Api 去 删选 数据
实现的 主要 流程

  1. template 部分
<script type="text/javascript">
 $(document).ready(function () {
$('#ab').click(function () {
 var filter_2 = $("#insert_value").val();//for City
  var filter_1 = $("#insert_value_1").val();// for Company type 
 var filter =  $('#filter').val();//for search 
    $.ajax({
   type: "GET",
    //data: {filter:filter, filter_1_value:filter_1,insert_value:insert_value},
    url: "https://horizon-retail-20170614-leon-ghibli.c9users.io/restful_api/companyviewset/?format=json",
    cache: false,
    dataType: "json",
     contentType : 'application/json',
     success: function (json) {
     $('#ajax_search').empty();
       showTable(json);
        },
      error: function () {
      alert("false");
      }
      });
    });
       });
        // create table by cycle 
function showTable(data){
  var dataArray =data;
   var len = dataArray.length;
   var tableStr = '';
  tableStr = '<table id="footable-res2" class="demo" data-filter="#filter" data-filter-text-only="true" data-page-size="20" rules="rows"><thead><tr><th data-toggle="true">{{ ui_setting.Company }}</th><th data-hide="phone">Company Name (Local)</th><th data-hide="phone">Brand(s) </th><th data-hide="phone,tablet">Company Type</th><th> City </th>  <data-hide="phone"> <th>Address</th> <th data-hide="all">  Action </th> </tr></thead>'
   tableStr = tableStr+'<tbody data-link="row" id ="ajax_search">'
 for(var i=0;i<len;i++){
   var len_2 = dataArray[i]['Brand'].length;
    var arr = []
    for(var j=0;j<len_2;j++){
      var brand_name =  dataArray[i]['Brand'][j]['Brand_Name']
      if (brand_name){ 
       brand_name_sup = '<a href="/brand/view_detail/'+dataArray[i]['Brand'][j]['id']+'/">'+brand_name  
        arr.push(brand_name_sup);
        arr.push('/');
 }
 }
   arr_2 = arr.join("");
    tableStr = tableStr+"<tr><td>" + '<a href="/company/view_detail/'+dataArray[i].id +'/">'+dataArray[i].Company_Name + "</td>" + "<td>" + dataArray[i].Company_Name_SC + "</td><td>" + arr_2 + "</td><td>" + dataArray[i].Company_Type + "</td>" +"<td>" +dataArray[i].City + "</td>" +"<td>" +dataArray[i].Address + "</td>"+ '<td style="white-space:nowrap;"> <a type="button" href="/company/edit/'+dataArray[i].id+'/" class="btn btn-info"><span class="entypo-pencil"></span>&nbsp;&nbsp;{{ ui_setting.Edit }}</a><a href="/company/delete/'+dataArray[i].Company_Name+'" type="button"  class="btn btn-danger" onclick="javascript: return submit_confirm();"><span class="entypo-trash"></span>&nbsp;&nbsp;{{ ui_setting.Delete }}</a></td>' +"</tr>"
            };
 tableStr = tableStr+'<tfoot><tr><td colspan="100%"><div class="pagination pagination-centered"></div></td></tr></tfoot></tbody></table>'
           $("#footable-res2").html(tableStr);
            $(function(){
                    $('table.demo').trigger('footable_initialize');
              });

        } 

    </script>
  1. Url部分

  2. Restful ViewSet部分

class CompanyViewSet(viewsets.ModelViewSet):
    serializer_class = CompanySerializer
    filter_backends (django_filters.rest_framework.DjangoFilterBackend,)
    def get_queryset(self):# how to define the null and None 
   filter_1 = self.request.query_params.get('a')#, None)  
   filter_company_type = self.request.query_params.get('b', None)#   company_type
  filter_city_type = self.request.query_params.get('c', None)
  Companyqueryset = Company.objects.all()
  if filter_1 or filter_company_type or filter_city_type:
             for item in Companyqueryset:
                if filter_1:
                    value_list = [item.Pref_Company_Name_Flg,item.Pref_Company_Name,item.Company_Type,item.Company_Name,item.Country,item.City,item.Address]
                    if not views.containsAnyInList(value_list,filter_1):
                        Companyqueryset=Companyqueryset.exclude(id=item.id)
                if filter_company_type:
                    company_type_list = filter_company_type.split(',')
                    if not views.containsAnyStringInList(company_type_list,item.Company_Type):
                        Companyqueryset=Companyqueryset.exclude(id=item.id)
                if filter_city_type:
                    city_type_list = filter_city_type.split(',')
                    if not views.containsAnyStringInList(city_type_list,item.City):
                        Companyqueryset=Companyqueryset.exclude(id=item.id)
        return  Companyqueryset
  1. 碰到 的问题
    1. 在 Restful Api 中 如何 实现 ManytoMany模型 的 展现 ,brandcompany是 多对多 的关系 在CompanySerializer 需要 加上 many=True 的关系,但是 怎么 实现 指定 显示 brand下面 的 菜单 呢 ?
class CompanySerializer(serializers.HyperlinkedModelSerializer):
    Brand = BrandSerializer(source='brand_set', read_only=True, many=True)
    Brand_Name = serializers.ReadOnlyField(source='Brand.Name', read_only=True) 
    class Meta:
        model = Company
        #fields = data_export_setting.Company_form_stand
        fields = ['id', 'Brand','Brand_Name','Company_Type','Company_Name','Company_Name_SC','IsIndividual','Pref_Client_Name','Pref_Client_Name_Flg','Country','City','Address','Address_SC','Status','Created_On','Created_by','Modified_On','Modified_By']

    def create(self, validated_data):
        return Company.objects.create(**validated_data)
    def update(self, instance, validated_data):
        instance.__dict__.update(**validated_data)
        instance.save()
        return instance        

2.前端js 显示 company 的 Brand.Brand_Name 的方式,最初使用的是Brand.Brand_Name,但是报错,正确的方式是

template already get the Brand object and how to show in the template ? "Brand.BrandName" is wrong!
len_2 = dataArray[i]['Brand'].length;
var arr = []
for(var j=0;j<len_2;j++){
var brand_name = dataArray[i]['Brand'][j]['Brand_Name']
if (brand_name){
brand_name_sup = ''+brand_name
arr.push(brand_name_sup);
arr.push('/');
    }
}

3 . 参考地址是这里 ,英语版本

4.没有办法理解实现ajax传参数到ViewSet类中指定的函数 ,文档中可以看到是 默认的函数get_queryset 处理参数 ,如果 参数 是多个的时候 使用self.request.query_params.get 这样的方式进行 得到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值