How can I change a Django form field value before saving?
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()
.
shibly
Updated on March 09, 2020Comments
-
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']
anduserf.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']