实现 的功能 :在 Django 内 使用 ajax 的 方式 调用 Restful Api 去 删选 数据
实现的 主要 流程
- 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> {{ 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> {{ 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>
Url部分
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
- 碰到 的问题
- 在 Restful Api 中 如何 实现 ManytoMany模型 的 展现 ,
brand
和company
是 多对多 的关系 在CompanySerializer
需要 加上many=True
的关系,但是 怎么 实现 指定 显示brand
下面 的 菜单 呢 ?
- 在 Restful Api 中 如何 实现 ManytoMany模型 的 展现 ,
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
这样的方式进行 得到