Django 的 request.GET 和 jQuery 数据表
考虑到这个例子 这里,它展示了如何用服务器提供的数据来填充 jQuery-Datatables 表格,一个典型的请求大概是这样的:
http://www.datatables.net/examples/server_side/scripts/server_processing.php?draw=2&columns%5B0%5D%5Bdata%5D=0&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=1&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=2&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=3&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=true&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B4%5D%5Bdata%5D=4&columns%5B4%5D%5Bname%5D=&columns%5B4%5D%5Bsearchable%5D=true&columns%5B4%5D%5Borderable%5D=true&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B5%5D%5Bdata%5D=5&columns%5B5%5D%5Bname%5D=&columns%5B5%5D%5Bsearchable%5D=true&columns%5B5%5D%5Borderable%5D=true&columns%5B5%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B5%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=10&length=10&search%5Bvalue%5D=&search%5Bregex%5D=false&_=1406235319463
那么,当 Django 在监听客户端请求时,处理这种数据的最佳方法是什么呢?
在旧版的 Datatables 这里,我可以通过创建一个像下面这样的表单,并用 request.GET 数据填充它,来轻松处理请求,这样可以方便地进行验证和数据转换。
class DataTablesForm(forms.Form):
iDisplayStart = forms.IntegerField(min_value=0)
iDisplayLength = forms.IntegerField(min_value=-1)
iSortingCols = forms.IntegerField(min_value=0, max_value=3)
mDataProp_0 = forms.CharField()
mDataProp_1 = forms.CharField()
mDataProp_2 = forms.CharField()
iSortCol_0 = forms.IntegerField(required=False, min_value=0, max_value=5)
iSortCol_1 = forms.IntegerField(required=False, min_value=0, max_value=5)
iSortCol_2 = forms.IntegerField(required=False, min_value=0, max_value=5)
sSortDir_0 = forms.ChoiceField(required=False, choices=(('asc', 'asc'), ('desc', 'desc')))
sSortDir_1 = forms.ChoiceField(required=False, choices=(('asc', 'asc'), ('desc', 'desc')))
sSortDir_2 = forms.ChoiceField(required=False, choices=(('asc', 'asc'), ('desc', 'desc')))
sEcho = forms.CharField(required=False)
还有
input_form = DataTablesForm(request.GET)
那么对于 新版 的格式,比如 "columns[i].name",它取代了 旧版 的 "mDataProp_(int)",我该怎么处理呢?
我觉得问题在于如何在 Django 中处理 JSON 格式的 GET 数据,如果“JSON 格式的 GET 数据”这个说法有意义的话。
1 个回答
0
对于这个具体的情况,我是这样解决的:
class DataTablesForm(forms.Form):
draw = forms.IntegerField()
length = forms.IntegerField()
start = forms.IntegerField()
def __init__(self, *args, **kwargs):
super(DataTablesForm, self).__init__(*args, **kwargs)
self.fields['_'] = forms.CharField()
for i in range(0, 3):
self.fields['columns[%d][data]' % i] = forms.CharField(required=False)
self.fields['columns[%d][name]' % i] = forms.CharField(required=False)
self.fields['columns[%d][orderable]' % i] = forms.BooleanField(required=False)
self.fields['columns[%d][search][regex]' % i] = forms.BooleanField(required=False)
self.fields['columns[%d][search][value]' % i] = forms.CharField(required=False)
self.fields['columns[%d][searchable]' % i] = forms.BooleanField(required=False)
self.fields['order[%d][column]' % i] = forms.IntegerField(required=False, min_value=0, max_value=2)
self.fields['order[%d][dir]' % i] = forms.ChoiceField(required=False, choices=(('asc', 'asc'), ('desc', 'desc')))
self.fields['search[regex]'] = forms.BooleanField(required=False)
self.fields['search[value]'] = forms.BooleanField(required=False)