Django的QueryDict(基於Python)
阿新 • • 發佈:2018-12-17
QueryDict:本身繼承dict,特性就是跟列表的一些屬性封裝起來了
初始化方法(__init__()):
def __init__(self, query_string=None, mutable=False, encoding=None): super(QueryDict, self).__init__() if not encoding: encoding = settings.DEFAULT_CHARSET self.encoding = encoding query_string = query_string or '' parse_qsl_kwargs = { 'keep_blank_values': True, 'fields_limit': settings.DATA_UPLOAD_MAX_NUMBER_FIELDS, 'encoding': encoding, } if six.PY3: if isinstance(query_string, bytes): # query_string normally contains URL-encoded data, a subset of ASCII. try: query_string = query_string.decode(encoding) except UnicodeDecodeError: # ... but some user agents are misbehaving :-( query_string = query_string.decode('iso-8859-1') for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs): self.appendlist(key, value) else: for key, value in limited_parse_qsl(query_string, **parse_qsl_kwargs): try: value = value.decode(encoding) except UnicodeDecodeError: value = value.decode('iso-8859-1') self.appendlist(force_text(key, encoding, errors='replace'), value) self._mutable = mutable
引數:
- query_string=None:建立QueryDict物件時,如果傳了一個QueryDict(字串),會有兩種特殊情況:
# 1.有&的符的情況,把&前後兩個值當做key
q = QueryDict('query&8',mutable=True)
# 結果:
<QueryDict: {'query': [''], '8': ['']}>
# 2.中間有'='的時候,會把等號左右的值,做key和value: q = QueryDict('query=8&next=/9',mutable=True) print(q) # 輸出: <QueryDict: {'query': ['8'], 'next': ['/9']}>
- mutable=True:(英文:易變的)
-
_mutable = True _encoding = None def __init__(self, query_string=None, mutable=False, encoding=None): self._mutable = mutable ''' 這是django的原始碼,_mutable本身是True,這個屬性是當你定義一個QueryDict物件, 你可以對它做修改; 但是初始化中,可以看到mutable預設值為False,然後又重新賦值給了_mutable, 所以你要想對QueryDict物件做增刪改時,就將它設為True; '''
在web開發中用的一個方法:
- QueryDict().urlencode:
-
''' q.urlencode()會把你物件中的所有key和value用=拼接起來 然後值與值之間用&連線 ''' q = QueryDict(mutable=True) q['query'] = '8' q['page'] = 2 print(q.urlencode()) # 結果 query=8&page=2
''' QueryDict會對你的特殊符號進行轉義; 所以可以利用這個,在web開發,獲取當前的路徑,傳給你要跳轉的頁面 ''' q = QueryDict(mutable=True) q['next'] = '/crm/customer/?query=8&page=2' print(q.urlencode()) # 結果: next=%2Fcrm%2Fcustomer%2F%3Fquery%3D8%26page%3D2