在清理之前修改传入django表单的数据

时间:2011-08-19 04:40:35

标签: python django

我需要在清理之前修改传入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 个答案:

答案 0 :(得分:6)

使data成为__init__方法的第一个参数,与超类Form相同。这样您就不必在argskwargs中挖掘。

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)

答案 1 :(得分:5)

您可以轻松地将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 argsif len(args) > 0一样有效,因为length == 0项目为Falselength > 0项目为True

if dataif data is not None一样有效,因为您假设data至少有一个密钥,如果它是not None,并且如果它有一个密钥则True {1}}。

答案 2 :(得分:1)

我找到了另一个解决方案:

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:似乎仍然有麻烦,而且工作不正常。

答案 3 :(得分:0)

documentation for form and field validation中所述,您无法在表单级别上执行此操作,因此__init__方法似乎是最合法的方法。您当然也可以在将数据传递给表单之前修改数据(例如在您的视图中或处理表单的任何位置)。