Изменить данные, поступающие в форму Django перед очисткой - PullRequest
5 голосов
/ 19 августа 2011

Мне нужно изменить данные, поступающие на Form перед очисткой.Я заставил это работать, но выглядит ужасно:

    def __init__(self, *args, **kwargs):
        if len(args) > 0:
            data = args[0]
        elif 'data' in kwargs:
            data = kwargs['data']
        else:
            data = None
        if data is not None:
            data['content'] = ' '.join(data['content'].strip().split())
        super(TagForm, self).__init__(*args, **kwargs)

Есть ли какое-то лаконичное решение?

Ответы [ 4 ]

6 голосов
/ 18 июня 2012

Сделать data первым аргументом метода __init__, таким же, как суперкласс Form. Таким образом, вам не нужно копаться в args или kwargs.

def __init__(self, data=None, *args, **kwargs):
    if data is not None:
        data = data.copy() # make it mutable
        data['content'] = ' '.join(data['content'].strip().split())
    super(TagForm, self).__init__(data, *args, **kwargs)
5 голосов
/ 19 августа 2011

Вы можете легко сжать if / elif / else в одну строку:

def __init__(self, *args, **kwargs):
    data = args[0] if args else kwargs.get('data', None)
    if data:
        data['content'] = ' '.join(data['content'].strip().split())
    super(TagForm, self).__init__(*args, **kwargs)

if args работает так же, как и if len(args) > 0, потому что length == 0 элементы False и length > 0 элементы True.

if data работает так же, как и if data is not None, потому что вы предполагаете, что у data есть хотя бы один ключ, если он все равно not None, а если у него есть ключ, то это True.

1 голос
/ 18 июня 2012

Я нашел другое решение:

def clean(self, *args, **kwargs):
    data = dict(self.data)
    if 'content' in data:
        content = data['content']
        if isinstance(content, list):
            content = content[0] # QueryDict wraps even single values to list
        data['content'] = ' '.join(content.strip().split())
    self.data = data # I do this trick becouse request.POST is immutable
    return super(MyForm, self).clean(*args, **kwargs)

UPD: исправление ошибки: super(self.__class__, self) может вызвать бесконечную рекурсию, если я использую наследование формы:).

UPD: кажется, все еще есть проблемы, и они не работают правильно.

0 голосов
/ 19 августа 2011

Как указано в документации для проверки формы и поля , вы не можете сделать это на уровне формы, поэтому метод __init__ кажется наиболее приемлемым. Конечно, вы также можете изменить данные перед передачей их в форму (например, по вашему мнению или при обработке формы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...