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

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -