あなたはこれについて間違った方法で進んでいます。
モデルは、モデル化するものの最も純粋な実装でなければなりません。モデルに関する何かが修正されている場合 (作成日など)、モデルで編集可能であってはなりません。変更可能な場合は、モデルで編集可能のままにします。
そうしないと、将来、あなた (または他の誰か) が、設定されているフィールドがeditable=False
どのように変更されているのか不思議に思うかもしれません。特にドキュメントに記載されているように:
False の場合、フィールドは admin またはその他の ModelForm に表示されません。また、モデルの検証中にもスキップされます。
(API などで) 編集できないビューが 1 つある場合は、そこでオーバーライドします。
モデルに複数のシリアライザーがある場合は、代わりにread_only_fields
セットで抽象シリアライザーを作成し、それをサブクラス化します。例えば:
class AbstractFooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
read_only_fields = ('bar',)
class MainFooSerializer(AbstractFooSerializer):
pass
class DifferentFooSerializer(AbstractFooSerializer):
pass
どうしても を使用したいが、作成時にのみeditable=False
管理サイトでアイテムを編集できるようにする場合は、困難な戦いになります。
おそらく最善の方法はAdminForm
、管理者に使用している を再実装することです
したがって、代わりに:
class FooAdmin(admin.ModelAdmin):
使用する:
class FooAdmin(admin.ModelAdmin):
form = MySpecialForm
次に、フォームを宣言します。
class MySpecialForm(forms.Model):
def __init__(self, *args, **kwargs):
self.is_new = False
if kwargs.get('instance',None) is None:
# There is no instance, thus its a new item
self.is_new = True
self.fields['one_time_field'] = forms.CharField() # Or what have you.
super(MySpecialForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
instance = super(MySpecialForm, self).save(commit)
if self.is_new:
instance.your_one_time_only_field = self.one_time_field
instance.save()
return instance
注: フィールドを手動で追加し、readonly
これを行う各フィールドを保存する必要があります。これは 100% 機能する場合とそうでない場合があります。