我想禁用在特定TabularInline实例中编辑所有对象,同时仍允许添加,同时仍允许编辑父模型。
我有这个简单的设置:
class SuperviseeAdmin(admin.TabularInline):
model = Supervisee
class SupervisorAdmin(admin.ModelAdmin):
inlines = [SuperviseeAdmin]
admin.site.register(Supervisor, SupervisorAdmin)
我尝试将has_change_permission
函数添加到SuperviseeAdmin
,无条件地返回False
,但它没有效果。
我已尝试在actions = None
中设置SuperviseeAdmin
,但它没有效果。
我可以忽略哪些可以让它发挥作用?
答案 0 :(得分:0)
请参阅此解决方案:Django admin: make field editable in add but not edit
覆盖get_readonly_fields方法:
def get_readonly_fields(self, request, obj=None):
if obj: # obj is not None, so this is an edit
return ['name1',..] # Return a list or tuple of readonly fields' names
else: # This is an addition
return []
答案 1 :(得分:0)
您可以尝试创建一个使用自定义ModelForm
的单独的内联类(请参阅InlineModelAdmin
docs),您可以在其中自定义clean
方法,以便在尝试更新时抛出错误:
from django.contrib import admin
from django.core.exceptions import ValidationError
from django.forms import ModelForm
from myapp.models import Supervisee
class SuperviseeModelForm(ModelForm):
class Meta(object):
model = Supervisee
# other options ...
def clean(self):
if self.instance.pk:
# instance already exists
raise ValidationError('Update not allowed')
# instance doesn't exist yet, continue
return super(SuperviseeModelForm, self).clean()
class SuperviseeInline(admin.TabularInline):
model = Supervisee
form = SuperviseeModelForm
class SuperviseeAdmin(admin.ModelAdmin):
inlines = [SuperviseeInline]
答案 2 :(得分:0)
用户django admin在函数has_change_permission()中构建并返回false以限制对象编辑视图。
class SuperviseeAdmin(admin.TabularInline):
model = Supervisee
def has_change_permission(self, request):
return False
class SupervisorAdmin(admin.ModelAdmin):
inlines = [SuperviseeAdmin]
admin.site.register(Supervisor, SupervisorAdmin)
答案 3 :(得分:-3)
class SuperviseeAdmin(admin.TabularInline):
model = Supervisee
def __init__(self, *args, **kwargs):
super(SuperviseeAdmin, self).__init__(*args, **kwargs)
self.list_display_links = (None, )