Expose Django's admin as a RESTFUL service
- [x] Support all of restful api
- [x] Auto generat serializers
- [x] Use Django Rest Framework
- [x] Fully customization support
- [x] Using Django Rest Framework ViewSet as AdminModels
- [x] Support default Django auth permission
- [x] Support Django custom model permission with simple configuration
- [x] Using Django Rest Framework Serializer(or ModelSerializer) as request validators
- [x] Support Single Serializer class to customize your detail view
- [x] Auto generate documentation for CURDs
- [x] Pagination and ability to change paginator
- [x] Support custom action with permission
- [x] Support all features in DRF
- [x] Support LogEntry (Log history of objects)
Todo
- [ ] Add some documentation
- [ ] Add custom route Api documentation
- [ ] Add list_display
- [ ] Add Filter And Search
- [ ] Add exlude
- [ ] Add Fields
- [ ] Example inline
- [ ] Localization
- [ ] Somethings that's need in future
How To Install
pip install django-restful-admin
add to INSTALED_APPS
INSTALLED_APPS = [
...
'rest_framework',
'django_restful_admin',
...
]
How To use
you need only add the bellow code to admin.py
in your apps
``` from django_restful_admin import admin from yourapp.models improt FisrtModel, ScoundModel
admin.site.register(FisrtModel)
admin.site.register(ScoundModel)
Then add URL to your project `urls.py`
```
from django_restful_admin import admin as api_admin
urlpatterns = [
...
path('apiadmin/', api_admin.site.urls),
...
]
Run the project and open URL http://your-ip:port/apiadmin/
enjoy!
Change Log
- [x] export admin in init.py
- [x] Add default django auth permissions support
- [x] Add admin.register decorator
Customization
Example
Create a new Django project
$ django-admin startproject example`
$ cd example
$ python manage.py startapp blog
Create blog app models in blog/models.py
from django.db import models
class Category(models.Model)
title = models.CharField(
max_length=255
)
class Post(models.Model):
title = models.CharField(
max_length=255
)
summery = models.TextField()
description = models.TextField()
category = models.ForeignKey(
Category,
related_name='products',
on_delete=models.CASCADE
)
Add your blog app in INSTALLED_APPS
in example/settings.py
INSTALLED_APPS = [
# Django default apps...
'rest_framework',
'django_restful_admin',
'blog'
]
Add admin URLs to django URLs in example/urls.py
from django.conf.urls import url
from django.contrib import admin
from django_restful_admin import admin as api_admin
from django.urls import path
urlpatterns = [
path('apiadmin/', api_admin.site.urls), # this line added
# path('admin/', admin.site.urls),
# your apis custom must be set here
]
Register your model to restful admin site in blog/admin.py
from django_restful_admin import admin as api_admin
from blog.models import *
api_admin.site.register(Post)
api_admin.site.register(Category)
Add View and use decorators blog/admin.py
...
@api_admin.register(Category, Product)
class MyCustomApiAdmin(BaseRestFulModelAdmin):
authentication_classes = (CustomTokenAuthentication,)
permission_classes = [IsAuthenticated]
...
Read more about authentication and permission DRF Documentation.
Customize serialization
At first, you must define your serializer class
Make serializers.py
file in blog
Open blog/serializers.py
and make serializer like this:
from rest_framework import serializers
from .models import *
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
feilds = ('id', 'title')
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('id','title)
class SingleProductSerializer(serializers.ModelSerializer):
category = CategorySerializer(read_only=True)
class Meta:
model = Product
feilds = ('id', 'title', 'summery', 'description', 'category')
from .serializers import ProductSerializer, SingleProductSerializer
@api_admin.register(Product)
class ProductApiAdmin(BaseRestFulModelAdmin):
serializer_class = ProductSerializer
single_serializer_class = SingleProductSerializer
serializer_class
use for serialize list of objects but single_serializer_class
use for serializer view signle object, update, partial update and create.
Add a custom route with permission
@api_admin.register(Product)
class MyCustomApiAdmin(BaseRestFulModelAdmin):
@api_admin.action(permission='product.view_product', detail=True, methods=['GET'], url_path=r'my-custom-action/(?P<another_key>[^/.]+)')
def my_custom_action(self, request, pk, another_key):
pass
## Do what you want to do
## this action make url like this /apiadmin/blog/product/2/my-custom-action/XXX
If you want to except permission you just send permission=True, for creating custom permission you can pass closure function or lambda to permission like this permission=lambda: view, action, request, obj=None: True
Contribute
If you think you can help me please let's start.