How can I change a Django form field value before saving?

61,424

Solution 1

If you need to do something to the data before saving, just create a function like:

def clean_nameofdata(self):
    data = self.cleaned_data['nameofdata']
    # do some stuff
    return data

All you need is to create a function with the name **clean_***nameofdata* where nameofdata is the name of the field, so if you want to modify password field, you need:

def clean_password(self):

if you need to modify passwordrepeat

def clean_passwordrepeat(self):

So inside there, just encrypt your password and return the encrypted one.

I mean:

def clean_password(self):
    data = self.cleaned_data['password']
    # encrypt stuff
    return data

so when you valid the form, the password would be encrypted.

Solution 2

See the documentation for the save() method

if request.method == 'POST':
    userf = UsersModelForm(request.POST)
    new_user = userf.save(commit=False)

    username = userf.cleaned_data['username']
    password = userf.cleaned_data['password']
    passwordrepeat = userf.cleaned_data['passwordrepeat']
    email = userf.cleaned_data['email']

    new_user.password = new1
    new_user.passwordrepeat = new2

    new_user.save()

Solution 3

You will have problems if you need to fill form from POST, change any form field value and render form again. Here is solution for it:

class StudentSignUpForm(forms.Form):
  step = forms.IntegerField()

  def set_step(self, step):
    data = self.data.copy()
    data['step'] = step
    self.data = data

And then:

form = StudentSignUpForm(request.POST)
if form.is_valid() and something():
  form.set_step(2)
  return  render_to_string('form.html', {'form': form})

Solution 4

Override _clean methods and put your checks in them. You can modify cleaned_data from there.

E.g:

def clean_password(self):
    new1 = self.cleaned_data['password']
    return new1

Every fields in the form will have a field_name_clean() method created automatically by Django. This method is called when you do form.is_valid().

Share:
61,424
shibly
Author by

shibly

Updated on March 09, 2020

Comments

  • shibly
    shibly about 4 years
    if request.method == 'POST':
        userf = UsersModelForm(request.POST)
        username = userf.data['username']
        password = userf.data['password']
        passwordrepeat = userf.data['passwordrepeat']
        email = userf.data['email']
    

    I tried this:

        tempSalt = bcrypt.gensalt()
        password = bcrypt.hashpw(password,tempSalt)
        passwordrepeat = bcrypt.hashpw(passwordrepeat,tempSalt)
    
        userf.data['password'] = password
        userf.data['passwordrepeat'] = passwordrepeat
    

    But i got error. How can i change the value of userf.data['password'] and userf.data['passwordrepeat'] before saving?

    Error:

    AttributeError at /register
    
    This QueryDict instance is immutable
    
    Request Method:     POST
    Request URL:    http://127.0.0.1:8000/register
    Django Version:     1.3.1
    Exception Type:     AttributeError
    Exception Value:    
    
    This QueryDict instance is immutable
    
    Exception Location:     /usr/local/lib/python2.6/dist-packages/django/http/__init__.py in _assert_mutable, line 359
    Python Executable:  /usr/bin/python
    Python Version:     2.6.6
    Python Path:    
    
    ['/home/user1/djangoblog',
     '/usr/lib/python2.6',
     '/usr/lib/python2.6/plat-linux2',
     '/usr/lib/python2.6/lib-tk',
     '/usr/lib/python2.6/lib-old',
     '/usr/lib/python2.6/lib-dynload',
     '/usr/local/lib/python2.6/dist-packages',
     '/usr/lib/python2.6/dist-packages',
     '/usr/lib/python2.6/dist-packages/gst-0.10',
     '/usr/lib/pymodules/python2.6',
     '/usr/lib/pymodules/python2.6/gtk-2.0']