これは、この SO questionの拡張です。
読み取り専用フォーム フィールドが変更されないように、必要な clean_X メソッドを動的に生成する簡単な方法はありますか? リンクされた質問で提案されているように、メソッドを手動で作成できますが、読み取り専用にする必要がある多くのフィールドを持つ複数のフォームがある場合、目新しさはすぐに失われます。
もっと良い方法があるはずです!
解決策:
提供された回答に基づいてForm.clean()
、基本クラスのメソッドをオーバーライドすることにしました。これは私のフォームが継承するクラスread_only
で、インスタンス属性のリストであるパラメーターを文字列として受け取ります。
class FormBase(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.read_only = kwargs.pop("read_only", [])
super(FormBase, self).__init__(*args, **kwargs)
#Disable any read only controls
for f in self.read_only:
self.fields[f].widget.attrs["readonly"] = True
def clean(self):
cleaned_data = super(FormBase, self).clean()
for f in self.read_only:
cleaned_data[f] = getattr(self.instance, f)
return cleaned_data