oz123
oz123

Reputation: 28858

Modified django form cleand_data do is not renedered in data

I want to add data to submitted data in a django form.

Until now I did something like this:

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)

This works, but I would like to do this check in a clean method, so I defined:

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

However, when I run this code with the clean method, I see that clean_data does not match data, and my rendered form does not contain a correct Account_Name (e.g. it does not have SVC in it):

   ipdb> p form.cleaned_data['Account_Name']
   u'SVCoz123'

   ipdb> p form.data['Account_Name']
   u'oz123'

The Account_Name from data is the one rendered to HTML, how can I fix this, so that Account_Name from cleaned_data is rendered?

update:

I found another way to do it, but I am still not sure it is the right way:

# 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()

second update:

After looking at my solution I decided my clean method can be a bit better, so I did:

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

the above solution works, although the django documentation says:

Always return the cleaned data, whether you have changed it or not.

So, now I am quite confused. I found a solution, but I need reaffirming it is a valid and good one. I would be happy if someone comments here about it.

Upvotes: 0

Views: 165

Answers (1)

Abbasov Alexander
Abbasov Alexander

Reputation: 1938

If I understood you have been attempts uses the clean method. If I right, you did it a little wrong. Try use def clean() with a form's field:

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 is used only into a forms. If I am not mistaken prefix would be assign each fields of the form as prefix-namefield

Upvotes: 1

Related Questions