Django 送信フォームデータをclean()メソッドで値を変更したり書き換える方法

Djangoでフォームの送信データを変更したり上書きしたい場合、クラスベースビューのform_valid()で書き換えることもあれば、フォームクラスのclean()、例えばModelFormサブクラスのclean()メソッドで書き換えたい場合もあります。

Form/ModelFormサブクラスのclean()メソッド では、スーパークラスのclean()の戻り値がcleaned_dataであり、ドキュメントによれば、まったく異なる辞書を返しても良いとされているので、次のようなコードで書き換えができます。

class MyForm(django.forms.ModelForm):
    def clean(self):
        cleaned_data = super(SomeForm, self).clean()
        cleaned_data['some_field'] = 'new value'
        return cleaned_data

The form subclass’s clean() method can perform validation that requires access to multiple form fields. This is where you might put in checks such as “if field A is supplied, field B must contain a valid email address”. This method can return a completely different dictionary if it wishes, which will be used as the cleaned_data.

https://docs.djangoproject.com/en/3.2/ref/forms/validation/

ちなみに、このサブクラスのclean()を呼び出した django.forms.BaseFormの_clean_form()メソッドは、clean()の戻り値でcleaned_dataを返せばそれを使用します。

class BaseForm:
def _clean_form(self):
try:
cleaned_data = self.clean()
except ValidationError as e:
self.add_error(None, e)
else:
if cleaned_data is not None:
self.cleaned_data = cleaned_data

django.forms.forms.py

ついでに、クラスベースビューのform_valid()での書き換えは、ModelFormの説明にある通りで、フォームのsave()メソッドでモデルのインスタンスを取り出し、値を変更してからモデルのsave()を呼び出します。
Creating forms from models The save() method 
少し調整した例となるコードもメモしておきます。

class MyCreateView(django.views.generic.CreateView):
    def form_valid(self, form):
        new_author = f.save(commit=False)
        new_author.some_field = 'some_value'
        new_author.save()

最近、動かして学ぶ!Python Django開発入門という本を読んだのですが、Djangoのコードの書き方の他、postgresqlデータベースやnginx、gunicornといった環境構築についても必要十分書いてあり読みやすかった印象でした。