我想以django形式向提交的数据添加数据。
直到现在我做了类似的事情:
form = NewADServiceAccount(data=request.POST)
if form.is_valid():
data=request.POST.copy()
if not 'SVC' in data['Account_Name']:
data['Account_Name'] = 'SVC_'+data['Account_Name']
form = NewADServiceAccount(data=data)
这有效,但我想用clean
方法检查,所以我定义了:
def clean_Account_Name(self):
data = self.cleaned_data['Account_Name']
if not 'SVC' in self.cleaned_data['Account_Name']:
data = 'SVC' + data
return data
但是,当我使用clean方法运行此代码时,我发现clean_data
与data
不匹配,
并且我呈现的表单不包含正确的Account_Name
(例如,它没有SVC):
ipdb> p form.cleaned_data['Account_Name']
u'SVCoz123'
ipdb> p form.data['Account_Name']
u'oz123'
Account_Name
中的data
是呈现为HTML的Account_Name
,我该如何解决此问题,以便cleaned_data
呈现# inside forms.py
class NewADServiceAccount(NewAccount):
Account_Name = forms.CharField(min_length=3, max_length=21, required=True,
#initial="Please write desired name of "
#+ "this service account.",
help_text="Please write the desired name "
+ "of this account. The prefix 'SVC_' will"
+ " be added to this name",)
def set_prefix(self, prefix='SVC_'):
data = self.data.copy()
data['Account_Name'] = prefix+data['Account_Name']
self.data = data
# in views.py:
if form.is_valid():
form.set_prefix()
?
我找到了另一种方法,但我仍然不确定这是正确的方法:
def clean_Account_Name(self):
data = self.data.copy()
if not 'SVC' in data['Account_Name']:
data['Account_Name'] = 'SVC' + data['Account_Name']
self.data = data
在查看我的解决方案后,我认为我的干净方法可以更好一些,所以我做了:
{{1}}
上述解决方案有效,但django文档说:
始终返回已清理的数据,无论您是否更改过。
所以,现在我很困惑。 我找到了解决方案,但我需要重申它是一个有效且好的解决方案。如果有人在这里发表评论,我会很高兴。
答案 0 :(得分:0)
如果我理解你曾经尝试过使用干净的方法。如果我对,你做错了。尝试将def clean()
与表单的字段一起使用:
class AccountNameField(forms.CharField):
def clean(self, value):
value = u'SVC' + value
return value
class NewADServiceAccount(forms.Form):
Account_Name = AccountNameField(min_length=3, max_length=21, required=True,
#initial="Please write desired name of "
#+ "this service account.",
help_text="Please write the desired name "
+ "of this account. The prefix 'SVC_' will"
+ " be added to this name",)
form = NewADServiceAccount(request.POST or None)
if form.is_valid():
...
prefix
仅用于表单。如果我没有弄错,prefix
会将表单的每个字段指定为 prefix-namefield