I surfed the web for something like this but I find only frontend solutions or obsolete guides. I wish to allow staff users to edit some default info such as first_name, last_name, email but also other extra info such bio, telephone, etc. I created a Profile class with a OneToOneField relation to User as suggested here but in this way only superuser can edit these informations. If I give can_change_user permission to the staff group each "staff" user can edit any profile.
edit these are the files of my app named users
#admin.py - users
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'Profile'
fk_name = 'user'
class CustomUserAdmin(UserAdmin):
inlines = (ProfileInline, )
def get_inline_instances(self, request, obj=None):
if not obj:
return list()
return super(CustomUserAdmin, self).get_inline_instances(request, obj)
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
#models.py - users
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
extra_info = models.CharField(max_length=30, blank=True)
@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
EDIT 1: I edited the two classes in this way
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'Profilo'
fk_name = 'user'
def has_change_permission(self, request, obj=None):
print("utente:")
print(request.user)
if obj == request.user:
return True
else:
return False
class CustomUserAdmin(UserAdmin):
inlines = (ProfileInline, )
# this function prints error *"get_queryset() missing 1 required positional argument: 'request'"*
'''
def get_queryset(self, request):
queryset = super(CustomUserAdmin, self).get_queryset()
queryset = queryset.filter(user=self.request.user)
return queryset
'''
def get_fieldsets(self, request, obj=None):
if not request.user.is_superuser:
if obj == request.user:
fieldsets = (
(('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
)
else:
fieldsets = ()
else:
fieldsets = self.fieldsets
return fieldsets
def get_inline_instances(self, request, obj=None):
if not obj:
return list()
return super(CustomUserAdmin, self).get_inline_instances(request, obj)
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)