我需要在清理之前修改传入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)
是否有一些简洁的解决方案?
答案 0 :(得分:6)
使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)
答案 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 args
与if len(args) > 0
一样有效,因为length == 0
项目为False
,length > 0
项目为True
。
if data
与if 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)
可能导致无限递归:)。
答案 3 :(得分:0)
如documentation for form and field validation中所述,您无法在表单级别上执行此操作,因此__init__
方法似乎是最合法的方法。您当然也可以在将数据传递给表单之前修改数据(例如在您的视图中或处理表单的任何位置)。