[英]How can I change a Django form field value before saving?
if request.method == 'POST':
userf = UsersModelForm(request.POST)
username = userf.data['username']
password = userf.data['password']
passwordrepeat = userf.data['passwordrepeat']
email = userf.data['email']
我試過這個:
tempSalt = bcrypt.gensalt()
password = bcrypt.hashpw(password,tempSalt)
passwordrepeat = bcrypt.hashpw(passwordrepeat,tempSalt)
userf.data['password'] = password
userf.data['passwordrepeat'] = passwordrepeat
但我有錯誤。 如何在保存前更改userf.data['password']
和userf.data['passwordrepeat']
?
錯誤:
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']
如果您需要在保存前對數據做一些事情,只需創建一個函數,如:
def clean_nameofdata(self):
data = self.cleaned_data['nameofdata']
# do some stuff
return data
您只需要創建一個名為 **clean_***nameofdata* 的函數,其中nameofdata是字段的名稱,因此如果要修改密碼字段,則需要:
def clean_password(self):
如果需要修改密碼repeat
def clean_passwordrepeat(self):
所以在里面,只需加密您的密碼並返回加密的密碼。
我的意思是:
def clean_password(self):
data = self.cleaned_data['password']
# encrypt stuff
return data
因此,當您驗證表單時,密碼將被加密。
請參閱save()
方法的文檔
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()
如果您需要從 POST 填寫表單、更改任何表單字段值並再次呈現表單,您將遇到問題。 這是它的解決方案:
class StudentSignUpForm(forms.Form):
step = forms.IntegerField()
def set_step(self, step):
data = self.data.copy()
data['step'] = step
self.data = data
接着:
form = StudentSignUpForm(request.POST)
if form.is_valid() and something():
form.set_step(2)
return render_to_string('form.html', {'form': form})
覆蓋_clean
方法並將您的檢查放入其中。 您可以從那里修改cleaned_data
。
例如:
def clean_password(self):
new1 = self.cleaned_data['password']
return new1
表單中的每個字段都有一個由 Django 自動創建的field_name_clean()
方法。 當您執行form.is_valid()
時會調用此方法。
在視圖中:
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.my_field = 'value'
obj.save()
在表格中:
instance = form.instance
instance.user = request.user
instance.save()
但要小心,這不會檢查is_valid()
。 如果你想這樣做,你可以用新值實例化表單:
# NOT TESTED, NOT SURE IF THIS WORKS...
form = MyForm(instance=instance)
if form.is_valid():
form.save()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.