Django disable editing (but allow adding) in TabularInline view

前端 未结 4 2221
小鲜肉
小鲜肉 2021-02-19 23:40

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

相关标签:
4条回答
  • 2021-02-19 23:41

    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 []
    
    0 讨论(0)
  • 2021-02-19 23:44

    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]
    
    0 讨论(0)
  • 2021-02-19 23:48

    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)
    
    0 讨论(0)
  • 2021-02-19 23:51
    class SuperviseeAdmin(admin.TabularInline):
      model = Supervisee
    
      def __init__(self, *args, **kwargs):
            super(SuperviseeAdmin, self).__init__(*args, **kwargs)
            self.list_display_links = (None, )
    
    0 讨论(0)
提交回复
热议问题