Как изменить значение поля формы Django перед сохранением?
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']
Ответы
Ответ 1
Если вам нужно что-то сделать с данными перед сохранением, просто создайте такую функцию, как:
def clean_nameofdata(self):
data = self.cleaned_data['nameofdata']
# do some stuff
return data
Все, что вам нужно, это создать функцию с именем ** clean _ *** nameofdata *, где nameofdata - это имя поля, поэтому, если вы хотите изменить поле пароля, вам нужно:
def clean_password(self):
если вам нужно изменить passwordrepeat
def clean_passwordrepeat(self):
Итак, внутри, просто кричите свой пароль и верните криптоватый.
Я имею в виду:
def clean_password(self):
data = self.cleaned_data['password']
# cript stuff
return data
поэтому, когда вы действуете в форме, пароль будет криптоваться.
Ответ 2
См. документацию для метода 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()
Ответ 3
Переопределить методы _clean
и поместить ваши проверки в них. Вы можете изменить cleaned_data
оттуда.
например:
def clean_password(self):
self.cleaned_data['password'] = new1
return new1
Каждое поле в форме будет иметь метод field_name_clean()
, созданный автоматически Django. Этот метод вызывается, когда вы выполняете form.is_valid()
.
Ответ 4
У вас возникнут проблемы, если вам нужно заполнить форму из 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})