Как изменить значение поля формы 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']

Если вам нужно что-то сделать с данными перед сохранением, просто создайте такую ​​функцию, как:

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

поэтому, когда вы действуете в форме, пароль будет криптоваться.

28
ответ дан 19 янв. '12 в 18:31
источник

См. документацию для метода 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()
8
ответ дан 19 янв. '12 в 14:23
источник

У вас возникнут проблемы, если вам нужно заполнить форму из 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})
5
ответ дан 17 мая '13 в 10:34
источник

Переопределить методы _clean и поместить ваши проверки в них. Вы можете изменить cleaned_data оттуда.

например:

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

Каждое поле в форме будет иметь метод field_name_clean(), созданный автоматически Django. Этот метод вызывается, когда вы выполняете form.is_valid().

5
ответ дан 19 янв. '12 в 14:10
источник