A modern, reactive Django admin interface powered by djust.
Status: Pre-Alpha - This project is in early development. APIs may change.
- Real-time search - Filter results as you type with debounced queries
- Live sorting - Click columns to sort without page reload
- Bulk actions - Select multiple items and perform actions
- Instant feedback - Form validation and save feedback in real-time
- Modern UI - Clean, responsive design with Tailwind CSS
- Django compatible - Works with existing Django models and permissions
pip install djust-adminINSTALLED_APPS = [
# ...
'djust',
'djust_admin',
# ...
]# myapp/admin.py
from djust_admin import DjustModelAdmin, site
from .models import Article, Author
@site.register(Article)
class ArticleAdmin(DjustModelAdmin):
list_display = ['title', 'author', 'published_date', 'status']
list_filter = ['status', 'author']
search_fields = ['title', 'content']
ordering = ['-published_date']
@site.register(Author)
class AuthorAdmin(DjustModelAdmin):
list_display = ['name', 'email', 'article_count']
search_fields = ['name', 'email']
def article_count(self, obj):
return obj.articles.count()
article_count.short_description = "Articles"# urls.py
from django.urls import path, include
from djust_admin import site
urlpatterns = [
# ... your other urls
path('djust-admin/', include(site.urls)),
]# asgi.py
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from djust.websocket import LiveViewConsumer
from django.urls import path
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter([
path('ws/live/', LiveViewConsumer.as_asgi()),
])
),
})class MyModelAdmin(DjustModelAdmin):
# List view
list_display = ['field1', 'field2'] # Fields to show in list
list_filter = ['status', 'created_at'] # Filter sidebar
search_fields = ['title', 'content'] # Searchable fields
list_per_page = 25 # Items per page
ordering = ['-created_at'] # Default ordering
# Detail view
fields = ['field1', 'field2'] # Fields to show in form
readonly_fields = ['created_at'] # Non-editable fields
fieldsets = [ # Group fields
('Basic Info', {'fields': ['title', 'slug']}),
('Content', {'fields': ['body']}),
]
# Actions
actions = ['publish', 'archive'] # Bulk actions
def publish(self, request, queryset):
queryset.update(status='published')
publish.short_description = "Publish selected"from djust_admin import DjustAdminSite
class MyAdminSite(DjustAdminSite):
site_header = "My Company Admin"
site_title = "Admin Portal"
index_title = "Welcome to the Admin"
admin_site = MyAdminSite(name='myadmin')| Feature | Django Admin | djust-admin |
|---|---|---|
| Page reloads for actions | Yes | No (WebSocket) |
| Search | On submit | Real-time |
| Sorting | Page reload | Instant |
| Form validation | On submit | Real-time |
| Bulk selection | Checkbox + submit | Live state |
| JavaScript required | ~150KB | ~5KB |
- Basic model list view with search/sort/pagination
- Model detail/edit view with form validation
- Delete confirmation
- Bulk actions (delete)
- Filter sidebar
- Inline related objects
- Foreign key autocomplete
- File upload support
- Custom actions with confirmation
- Dashboard widgets
- Activity log
- User preferences
- Themes
Contributions are welcome! Please see CONTRIBUTING.md.
MIT License - see LICENSE for details.