33
44from django .core .exceptions import ValidationError
55from django .db .models import Q
6+ from django .db .models .fields .related import RelatedField
67from django .http import HttpResponse
78from django .shortcuts import render
89
2223DYNAMIC_DATATB = {}
2324
2425try :
25- DYNAMIC_DATATB = getattr (settings , 'DYNAMIC_DATATB' )
26- except :
27- pass
26+ DYNAMIC_DATATB = getattr (settings , 'DYNAMIC_DATATB' )
27+ except :
28+ pass
2829
2930# TODO: 404 for wrong page number
3031def data_table_view (request , ** kwargs ):
3132 try :
3233 model_class = Utils .get_class (DYNAMIC_DATATB , kwargs .get ('model_name' ))
3334 except KeyError :
3435 return render (request , '404.html' , status = 404 )
35- headings = [field .name for field in model_class ._meta .get_fields ()]
36-
36+ headings = _get_headings (model_class )
3737 page_number = int (request .GET .get ('page' , 1 ))
3838 search_key = request .GET .get ('search' , '' )
3939 entries = int (request .GET .get ('entries' , 10 ))
@@ -149,8 +149,7 @@ def export(request, **kwargs):
149149 export_type = request_body .get ('type' , 'csv' )
150150 filter_options = Q ()
151151
152- headings = filter (lambda field : field .name not in hidden ,
153- [field for field in model_class ._meta .get_fields ()])
152+ headings = filter (lambda field : field .name not in hidden , _get_headings (model_class ))
154153 headings = list (headings )
155154 for field in headings :
156155 field_name = field .name
@@ -230,3 +229,19 @@ def get_random_string(length):
230229 # choose from all lowercase letter
231230 letters = string .ascii_lowercase
232231 return '' .join (random .choice (letters ) for i in range (length ))
232+
233+
234+ def _get_headings (model_class , filter_relations = True ):
235+ headings = []
236+ for field in model_class ._meta .get_fields ():
237+ if filter_relations and _is_relation_field (field ):
238+ continue
239+ headings .append (field .name )
240+ return headings
241+
242+ def _is_relation_field (field ):
243+ is_many_to_many_field = field .many_to_many is not None
244+ is_many_to_one_field = field .many_to_one is not None
245+ is_one_to_many_field = field .one_to_many is not None
246+ is_one_to_one_field = field .one_to_one is not None
247+ return is_many_to_many_field or is_many_to_one_field or is_one_to_many_field or is_one_to_one_field
0 commit comments