Имея ту же проблему, я наткнулся на это исправление:
Создайте два встроенных объекта, один без разрешения на изменение, а другой со всеми полями только для чтения.Включите оба в модель администратора.
class SubscriptionInline(admin.TabularInline):
model = Subscription
extra = 0
readonly_fields = ['subscription', 'usedPtsStr', 'isActive', 'activationDate', 'purchaseDate']
def has_add_permission(self, request):
return False
class AddSupscriptionInline(admin.TabularInline):
model = Subscription
extra = 0
fields = ['subscription', 'usedPoints', 'isActive', 'activationDate', 'purchaseDate']
def has_change_permission(self, request, obj=None):
return False
# For Django Version > 2.1 there is a "view permission" that needs to be disabled too (https://docs.djangoproject.com/en/2.2/releases/2.1/#what-s-new-in-django-2-1)
def has_view_permission(self, request, obj=None):
return False
Включите их в ту же модель администратора:
class UserAdmin(admin.ModelAdmin):
inlines = [ AddSupscriptionInline, SubscriptionInline]
Чтобы добавить новую подписку, я использую AddSubscriptionInline
в администраторе.После сохранения новая подписка исчезает из этой строки, но теперь она появляется в SubscriptionInline
, как только для чтения.
Для SubscriptionInline
важно упомянуть extra = 0
, поэтому она выигралане показывать нежелательные подписки только для чтения.Также лучше скрыть опцию добавления для SubscriptionInline
, чтобы разрешить добавление только через AddSubscriptionInline
, установив для has_add_permission
постоянное возвращение False
.
Совсем не идеально, но этолучший вариант для меня, так как я должен предоставить возможность добавлять подписки на страницу администратора пользователя, но после добавления она должна изменяться только через внутреннюю логику приложения.