修改后的django表单clean_data do不会在数据中呈现

时间:2013-07-14 07:20:27

标签: python django django-forms

我想以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_datadata不匹配, 并且我呈现的表单不包含正确的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文档说:

  

始终返回已清理的数据,无论您是否更改过。

所以,现在我很困惑。 我找到了解决方案,但我需要重申它是一个有效且好的解决方案。如果有人在这里发表评论,我会很高兴。

1 个答案:

答案 0 :(得分:0)

如果我理解你曾经尝试过使用干净的方法。如果我对,你做错了。尝试将def clean()与表单的字段一起使用:

forms.py

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",)

views.py

form = NewADServiceAccount(request.POST or None)
if form.is_valid():
   ...

prefix仅用于表单。如果我没有弄错,prefix会将表单的每个字段指定为 prefix-namefield