你正在以错误的方式解决这个问题。
您的模型应该是您正在建模的事物的最纯粹的实现。如果有关模型的某些内容是固定的(例如创建日期),则它不应该在模型中可编辑,如果它是可变的,则在模型中保留为可编辑。
否则,将来您(或其他人)可能会想知道为什么设置为的字段是editable=False
如何更改的。特别是如文档所述:
如果为 False,该字段将不会显示在 admin 或任何其他 ModelForm 中。在模型验证期间它们也会被跳过。
如果您有一个不应在其中编辑的视图(例如在 API 中),则在此处覆盖它。
如果一个模型有多个序列化器,请改为使用一个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% 的功能。