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