Django禁用TabularInline视图中的编辑(但允许添加)

时间:2010-06-01 17:10:35

标签: django django-admin

我想禁用在特定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,但它没有效果。

我可以忽略哪些可以让它发挥作用?

4 个答案:

答案 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, )