Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django disable editing (but allow adding) in TabularInline view

I want to disable editing ALL objects within a particular TabularInline instance, while still allowing additions and while still allowing editing of the parent model.

I have this trivial setup:

class SuperviseeAdmin(admin.TabularInline):
  model = Supervisee

class SupervisorAdmin(admin.ModelAdmin):
  inlines = [SuperviseeAdmin]

admin.site.register(Supervisor, SupervisorAdmin)

I have tried adding a has_change_permission function to SuperviseeAdmin that returns False unconditionally, but it had no effect.

I have tried setting actions = None in SuperviseeAdmin but it had no effect.

What might I be overlooking that could get this to work?

like image 718
VoteyDisciple Avatar asked Jun 01 '10 17:06

VoteyDisciple


3 Answers

See this solution: Django admin: make field editable in add but not edit

Override get_readonly_fields method:

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 []
like image 88
Sudipta Avatar answered Nov 02 '22 18:11

Sudipta


User django admin build in function has_change_permission() and return false to restrict object Edit view.

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)
like image 4
SuReSh Avatar answered Nov 02 '22 19:11

SuReSh


You can try creating a separate inline class (see the InlineModelAdmin docs) that uses a custom ModelForm where you can customise the the clean method to throw an error when trying to update:

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]
like image 1
Villiers Strauss Avatar answered Nov 02 '22 19:11

Villiers Strauss