Change Django Form Data before it's processed -
i have form model wich has 2 fields: field_a , field_b. want to:
- when form rendered: field_a displayed
- when call form.save() field_b saved in model value field_a
what i've tried:
field_a = forms.charfield(required=true) field_b = forms.charfield(required=false) def save(self, *args, **kwargs): """ overriding save, call parent form save , return new_user object. """ self.data["field_b"] = self.data["field_a"] self.cleaned_data["username"] = self.cleaned_data["email"] super(myparentclass*, self).save(*args, **kwargs)
*both fields inherited parentclass, required
here solution worked me.
# models.py class mymodel(models.model): field_a = models.charfield(max_length = 255) field_b = models.charfield(max_length = 255) def __unicode__(self): return "%s: %s, %s" % (self.pk, self.field_a, self.field_b) # forms.py class mymodelform(modelform): class meta: model = mymodel exclude = ('field_b',) def save(self, *args, **kwargs): commit = kwargs.pop('commit', true) instance = super(mymodelform, self).save(*args, commit = false, **kwargs) instance.field_b = self.cleaned_data['field_a'] if commit: instance.save() return instance
explanation of form's meta
exclude = ('field_b',)
ensures first condition met. when form shown user field_a
displayed. second condition addressed in overridden save()
method.
explanation of save()
commit = kwargs.pop('commit', true)
extract commit
keyword argument if supplied.
instance = super(mymodelform, self).save(*args, commit = false, **kwargs)
create instance of underlying model. explicitly pass commit=false
ensure instance not saved database yet.
instance.field_b = self.cleaned_data['field_a']
assign value of field_a
cleaned_data
instance's field_b
. remember should have called form.is_valid()
before this. otherwise there no cleaned_data
.
if commit: instance.save()
if user wants instance saved database that.
return instance
finally, return instance.
sample usage
in [1]: app.forms import mymodelform in [2]: f = mymodelform(data = {'field_a': 'value a'}) in [3]: f.is_valid() out[3]: true in [4]: f.save() out[4]: <mymodel: 3: value a, value a> in [5]: f = mymodelform(data = {'field_a': 'va'}) in [6]: f.is_valid() out[6]: true in [7]: f.save(commit = false) out[7]: <mymodel: none: va, va> in [8]:
Comments
Post a Comment