3
3
4
4
from django .core .exceptions import ValidationError
5
5
from django .db .models import Q
6
+ from django .db .models .fields .related import RelatedField
6
7
from django .http import HttpResponse
7
8
from django .shortcuts import render
8
9
22
23
DYNAMIC_DATATB = {}
23
24
24
25
try :
25
- DYNAMIC_DATATB = getattr (settings , 'DYNAMIC_DATATB' )
26
- except :
27
- pass
26
+ DYNAMIC_DATATB = getattr (settings , 'DYNAMIC_DATATB' )
27
+ except :
28
+ pass
28
29
29
30
# TODO: 404 for wrong page number
30
31
def data_table_view (request , ** kwargs ):
31
32
try :
32
33
model_class = Utils .get_class (DYNAMIC_DATATB , kwargs .get ('model_name' ))
33
34
except KeyError :
34
35
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 )
37
37
page_number = int (request .GET .get ('page' , 1 ))
38
38
search_key = request .GET .get ('search' , '' )
39
39
entries = int (request .GET .get ('entries' , 10 ))
@@ -149,8 +149,7 @@ def export(request, **kwargs):
149
149
export_type = request_body .get ('type' , 'csv' )
150
150
filter_options = Q ()
151
151
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 ))
154
153
headings = list (headings )
155
154
for field in headings :
156
155
field_name = field .name
@@ -230,3 +229,19 @@ def get_random_string(length):
230
229
# choose from all lowercase letter
231
230
letters = string .ascii_lowercase
232
231
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