Проблема также зависит от версии Django. Вы используете Django 1.7.x или более позднюю версию, для чего требуется параметр позиционирования query_string
для QueryDict. Он зафиксирован в Django 1.8, где этот параметр является необязательным.
Вторая проблема заключается в том, что QueryDict
создает по умолчанию в непреложного экземпляр, и нет никакого способа, как пройти через mutable=True
fromkeys
. Ключи не могут быть добавлены к неизменяемым, и метод также не работает в Django 1.8.
Это может быть исправлено таким образом:
from django.http.request import QueryDict
class MyQueryDict(QueryDict):
@classmethod
def fromkeys(cls, seq, value='', encoding=None):
result = cls('', mutable=True, encoding=encoding)
for key in seq:
result.appendlist(key, value) # or result.update(key, value)
return result
Это реализуется более сложным, с тем чтобы отразить повторяющиеся ключи. Значение по умолчанию - это пустая строка, потому что нет смысла преобразовывать ее в строку «Нет», например 'potato=None&spam=None&spam=None'
по методу urlencode()
. Результат по умолчанию QueryDict должен быть таким же, как QueryDict('potato&spam&spam')
.
Представленное решение настолько странно, что raise NotImplemented()
было бы более простой «реализацией». (EDIT: я не ожидаю, что что-то еще достаточно полезно для того, чтобы быть принятым на базу кода Django). Однако я должен согласиться с вами, это ошибка с таинственными сообщениями. Невыполненные функциональные возможности обычно недокументированы, если они не требуют предупредительной заметки, поскольку их можно найти бесконечно много.
Другое решение было бы изменить только __init__
:
class MyQueryDict(QueryDict):
def __init__(self, query_string=None, mutable=True, encoding=None):
super(MyQueryDict, self).__init__(query_string=query_string,
mutable=mutable,
encoding=encoding)
потому что неизменные экземпляры QueryDict часто непрактично и даже одна половина внутреннего использования в Django является с изменяемыми экземплярами QueryDict.
Почему вы хотите использовать его вообще? –
Почему бы и нет? – wim
Я не могу воспроизвести эту ошибку. Кажется странным, в любом случае ни один из классов в цепочке наследования не имеет никаких аргументов для '__init __()'. – knbk