Ale*_*erg 4 django-models django-forms django-admin django-serializer django-rest-framework
DRF 将在字段上使用editable=False来将序列化器默认为只读。这是我利用的一个非常有用/安全的默认值(即我不会忘记将序列化器设置为只读)。话虽这么说,一旦我设置了,editable=False有什么方法可以强制 Django 管理员允许编辑这些字段之一?
想必管理员是超级用户,我确实希望他能够更改字段值,但为了安全起见,我希望默认Serializer逻辑是只读的。
更新
实际上,我不需要在创建对象时像“设置”那样能够编辑字段。
小智 5
你的处理方式是错误的。
您的模型应该是您正在建模的事物的最纯粹的实现。如果模型的某些内容是固定的(例如创建日期),则它在模型中不应该是可编辑的,如果它是可变的,则在模型中保留为可编辑状态。
否则,将来您(或其他人)可能会想知道为什么设置的字段会editable=False被更改。特别是如文档所述:
如果为 False,该字段将不会显示在管理或任何其他模型表单中。在模型验证期间也会跳过它们。
如果您有一个视图不可编辑(例如在 API 中),则在那里覆盖它。
如果一个模型有多个序列化器,请改为使用一个read_only_fields集合创建一个抽象序列化器,然后对其进行子类化。例如:
class AbstractFooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
read_only_fields = ('bar',)
class MainFooSerializer(AbstractFooSerializer):
pass
class DifferentFooSerializer(AbstractFooSerializer):
pass
Run Code Online (Sandbox Code Playgroud)
如果您真的非常想使用,但仅editable=False允许在创建时在管理站点中编辑该项目您将面临一场艰苦的战斗。
最好的方法可能是重新实现AdminForm您用于管理员的
所以而不是:
class FooAdmin(admin.ModelAdmin):
Run Code Online (Sandbox Code Playgroud)
使用:
class FooAdmin(admin.ModelAdmin):
form = MySpecialForm
Run Code Online (Sandbox Code Playgroud)
然后声明形式:
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
Run Code Online (Sandbox Code Playgroud)
注意:您需要手动添加字段并保存readonly要执行此操作的每个字段。这可能会也可能不会 100% 起作用。
| 归档时间: |
|
| 查看次数: |
4841 次 |
| 最近记录: |