How can I change a Django form field value before saving?

前端 未结 5 1006
[愿得一人]
[愿得一人] 2021-01-31 08:29
if request.method == \'POST\':
    userf = UsersModelForm(request.POST)
    username = userf.data[\'username\']
    password = userf.data[\'password\']
    passwordrepea         


        
相关标签:
5条回答
  • 2021-01-31 09:21

    See the documentation for the save() method

    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()
    
    0 讨论(0)
  • 2021-01-31 09:22

    Override _clean methods and put your checks in them. You can modify cleaned_data from there.

    E.g:

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

    Every fields in the form will have a field_name_clean() method created automatically by Django. This method is called when you do form.is_valid().

    0 讨论(0)
  • 2021-01-31 09:25

    You will have problems if you need to fill form from POST, change any form field value and render form again. Here is solution for it:

    class StudentSignUpForm(forms.Form):
      step = forms.IntegerField()
    
      def set_step(self, step):
        data = self.data.copy()
        data['step'] = step
        self.data = data
    

    And then:

    form = StudentSignUpForm(request.POST)
    if form.is_valid() and something():
      form.set_step(2)
      return  render_to_string('form.html', {'form': form})
    
    0 讨论(0)
  • 2021-01-31 09:27

    If you need to do something to the data before saving, just create a function like:

    def clean_nameofdata(self):
        data = self.cleaned_data['nameofdata']
        # do some stuff
        return data
    

    All you need is to create a function with the name **clean_***nameofdata* where nameofdata is the name of the field, so if you want to modify password field, you need:

    def clean_password(self):
    

    if you need to modify passwordrepeat

    def clean_passwordrepeat(self):
    

    So inside there, just encrypt your password and return the encrypted one.

    I mean:

    def clean_password(self):
        data = self.cleaned_data['password']
        # encrypt stuff
        return data
    

    so when you valid the form, the password would be encrypted.

    0 讨论(0)
  • 2021-01-31 09:31

    In Views:

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.my_field = 'value'
            obj.save()
    

    In Forms:

    instance = form.instance
    instance.user = request.user
    instance.save()
    

    But be careful, this does not check is_valid(). If you want to do that, you can instantiate the form with the new values:

    # NOT TESTED, NOT SURE IF THIS WORKS...
    form = MyForm(instance=instance)
    if form.is_valid():
        form.save()
    
    0 讨论(0)
提交回复
热议问题