2

これは、この 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
4

1 に答える 1