Traduction automatique supervisée
Ce contenu est traduit à l'aide d'une génération automatique guidée par des glossaires et des guides de style élaborés par des humains. Le texte n'étant pas relu manuellement ligne par ligne, des erreurs ou des tournures maladroites peuvent occasionnellement apparaître.
En cas de divergence, la version anglaise constitue la source de référence.
Venir de Django Admin
Si vous connaissez Django Admin, starlette-admin vous semblera familier. Les deux génèrent une interface d'administration à partir d'une configuration déclarative, modèle par modèle, et prennent tous deux en charge l'édition en ligne, les actions par lot et des permissions par requête.
Les différences sont structurelles : starlette-admin fonctionne sur n'importe quelle application ASGI au lieu d'exiger Django, prend en charge plusieurs ORM et vous permet de brancher votre propre authentification plutôt que d'imposer un modèle utilisateur intégré.
Ce guide fait correspondre chaque concept majeur de ModelAdmin à son équivalent starlette-admin, avec du code côte à côte.
Modèle mental
| Concept Django Admin | Équivalent starlette-admin |
|---|---|
AdminSite |
Instance de Admin montée sur votre application |
ModelAdmin |
Sous-classe de ModelView |
admin.site.register(Model, ModelAdmin) |
admin.add_view(MyView(Model)) |
admin.site.urls dans urlpatterns |
admin.mount_to(app) |
| Django ORM | SQLAlchemy, SQLModel, MongoEngine, Beanie ou Tortoise ORM via starlette_admin.contrib.* |
__str__ sur le modèle |
__admin_repr__(self, request), qui est asynchrone et tient compte de la requête |
| Champs de formulaire déduits des champs du modèle | Champs déduits par le convertisseur du backend, personnalisables champ par champ |
Enregistrer un modèle
from starlette_admin.contrib.sqla import Admin, ModelView
class PostView(ModelView):
fields = ["id", "title", "content", "published", "created_at"]
exclude_fields_from_list = ["content"]
searchable_fields = ["title", "content"]
admin = Admin(engine, title="Blog Admin", secret_key="change-me")
admin.add_view(PostView(Post, icon="fa fa-newspaper"))
admin.mount_to(app) # app is your FastAPI or Starlette instance
Deux différences structurelles ressortent :
- Une seule liste de champs pilote toutes les pages.
fieldsconstitue la source de vérité unique. Vous utilisez ensuiteexclude_fields_from_list,exclude_fields_from_detail,exclude_fields_from_createetexclude_fields_from_editpour des variations par page. - L'instance
Admindétient le moteur de base de données. Vous ne passez pas une session à chaque vue.
Options de la page de liste
| Django Admin | starlette-admin | Remarques |
|---|---|---|
list_display |
fields moins exclude_fields_from_list |
Une seule liste de champs pilote toutes les pages. |
list_display avec un callable ou @admin.display |
ComputedField, ou getter= sur n'importe quel champ |
Par exemple, ComputedField("full_name", getter=lambda request, obj: ...). Utilisez getter= sur un champ typé, tel qu'un champ date ou image, pour conserver le rendu propre à ce type. |
| Reformater une vraie colonne pour l'affichage | formatter= sur le champ |
Un dict[RequestAction, callable], de sorte que la liste, le détail et l'export puissent formater différemment. Django exige un callable plus admin_order_field pour conserver le tri ; ici la colonne reste triable. |
search_fields |
searchable_fields |
Alimente à la fois la recherche plein texte et le constructeur de filtres. |
list_filter |
searchable_fields combiné aux filters= par champ |
Les utilisateurs disposent d'un constructeur visuel avec des groupes AND/OR imbriqués au lieu d'une barre latérale fixe. Voir Filtres. |
ordering |
fields_default_sort |
Par exemple, fields_default_sort = [("created_at", True)] trie par ordre décroissant. |
admin_order_field / triabilité |
sortable_fields |
Chaque champ est triable par défaut. |
list_editable |
inline_editable_fields |
Les utilisateurs sélectionnent une cellule et la modifient directement. |
list_per_page |
page_size, page_size_options |
Contrôle les limites de pagination. |
date_hierarchy |
Filtres de date, tels que between et in the past |
Il n'existe pas de barre dédiée de navigation hiérarchique ; le constructeur de filtres couvre ce cas. |
empty_value_display |
Une entrée formatter=, ou null_template |
Les formatters reçoivent les valeurs None, ils peuvent donc substituer un espace réservé. null_template remplace le balisage rendu à la place. |
Formulaires
| Django Admin | starlette-admin | Remarques |
|---|---|---|
fields / exclude |
fields, exclude_fields_from_create, exclude_fields_from_edit |
Contrôle la visibilité des champs du formulaire. |
fieldsets |
form_layout |
Composez librement avec FieldsetWidget, TabsWidget, GridWidget et RowWidget. |
readonly_fields |
read_only=True sur le champ |
Vous pouvez aussi exclure le champ des vues create et edit. |
prepopulated_fields |
SlugField("slug", populate_from="title") |
Même comportement de génération de slug en direct. |
autocomplete_fields, raw_id_fields |
Comportement par défaut de HasOne / HasMany |
Les widgets de relation sont des entrées Select2 avec recherche côté serveur, prêts à l'emploi. |
filter_horizontal / filter_vertical |
HasMany |
Rendu sous forme de composant multi-sélection avec recherche. |
formfield_overrides |
Entrées explicites dans la liste fields |
Remplacez directement le champ détecté automatiquement : fields = ["id", TextAreaField("bio")] |
| Validation de formulaire personnalisée | validators= sur le champ ou FormValidationError dans les hooks |
Voir Validateurs. |
to_python() du champ de formulaire / coercition personnalisée |
parser= sur le champ |
Remplace l'analyse par défaut du formulaire ou de l'importation du champ selon la RequestAction. |
| Texte d'aide du formulaire de modèle | help_text= |
Disponible sur toute définition de champ. |
Exemple de fieldsets
form_layout va plus loin que les fieldsets : vous pouvez créer des onglets, des grilles responsives et des mises en page imbriquées. Voir Form Layout.
Inlines
starlette-admin détecte la clé étrangère lorsqu'elle est non ambiguë et prend en charge les clés étrangères composites. Consultez Formulaires inline pour les configurations avancées.
Actions
from starlette_admin import ActionSelection, action, flash
class ArticleView(ModelView):
actions = ["make_published", "delete"]
@action(
name="make_published",
text="Mark selected articles as published",
confirmation="Publish the selected articles?",
)
async def make_published(
self, request: Request, selection: ActionSelection
) -> None:
for article in await selection.rows():
article.published = True
flash(request, "Articles published")
Là où Django Admin passe un QuerySet, le handler starlette-admin reçoit un objet ActionSelection. Il résout paresseusement les lignes, les clés primaires et les filtres actifs, et se comporte de la même manière lorsqu'un utilisateur sélectionne tous les enregistrements correspondants.
Les actions peuvent également afficher un formulaire HTML personnalisé dans la boîte de dialogue de confirmation, ce qui, dans Django Admin, implique la construction d'une page intermédiaire. Pour les opérations par ligne, utilisez @row_action et @link_row_action, qui n'ont pas d'équivalent dans Django Admin.
Permissions et authentification
Django Admin délègue à django.contrib.auth. starlette-admin scinde le problème en deux : un AuthProvider répond « qui est cet utilisateur », et les méthodes par vue répondent « que peut-il faire ».
| Django Admin | starlette-admin |
|---|---|
Connexion via django.contrib.auth |
AuthProvider (page de connexion intégrée) ou OAuthProvider (flux de redirection OIDC) |
request.user |
request.state.admin_user |
has_module_permission |
is_accessible(request) sur la vue |
has_view_permission |
can_view_detail(request) |
has_add_permission |
can_create(request) |
has_change_permission |
can_edit(request) |
has_delete_permission |
can_delete(request) |
get_readonly_fields par utilisateur |
can_access_field(request, field) |
| Pas d'équivalent | can_export(request), can_import(request), is_action_allowed(request, name) |
La vue suivante restreint la suppression aux utilisateurs ayant le rôle admin :
class ArticleView(ModelView):
def can_delete(self, request: Request) -> bool:
return "admin" in request.state.admin_user.roles
Chaque méthode can_* reçoit la requête : vos décisions d'autorisation peuvent donc lire l'utilisateur courant, les en-têtes HTTP ou tout autre élément de la requête.
Hooks d'enregistrement et signaux
| Django Admin | starlette-admin | Remarques |
|---|---|---|
save_model(request, obj, form, change) |
before_create / before_edit sur la vue |
Nativement asynchrone, et reçoit les données de formulaire analysées avec l'instance du modèle. |
delete_model |
before_delete |
Gère la logique pré-suppression. |
post_save et autres signaux |
Événements | Par exemple, admin.events.on(AdminEvent.AFTER_CREATE, handler) diffuse à toutes les vues. |
Historique des modifications LogEntry |
Construisez-le avec le système d'événements | Abonnez-vous à AFTER_CREATE, AFTER_EDIT et AFTER_DELETE pour alimenter votre propre table d'audit. |
messages.success(request, ...) |
flash(request, ...) |
Voir Messages flash. |
Configuration globale du site
| Django Admin | starlette-admin |
|---|---|
admin.site.site_header, site_title |
Admin(title="...") |
| Logo personnalisé via une surcharge de template | Admin(logo_url="...", login_logo_url="...", favicon_url="...") |
AdminSite.index_template |
Admin(index_view=...) avec des widgets pour un tableau de bord riche |
Surcharges de template dans templates/admin/ |
Admin(templates_dir="..."), voir Templates |
Instances multiples de AdminSite |
Instances multiples de Admin montées sur différents chemins de l'application |
ModelAdmin.get_queryset |
get_list_query, get_count_query ou get_detail_query pour le backend SQLAlchemy |
USE_I18N, LANGUAGES |
Admin(i18n_config=I18nConfig(default_locale="fr")) |
TIME_ZONE |
Admin(timezone_config=TimezoneConfig(...)), voir i18n et fuseaux horaires |
Ce que vous gagnez en migrant
- Asynchronisme de bout en bout : les handlers, les lifecycle hooks et les callbacks de widgets peuvent tous être des coroutines exécutées sur votre boucle d'événements existante, aux côtés de vos endpoints FastAPI.
- Flexibilité de la base de données : la même configuration d'administration s'applique que vous utilisiez SQLAlchemy, SQLModel, MongoDB via MongoEngine ou Beanie, ou Tortoise ORM.
- Export et import intégrés : CSV, JSON et PDF, plus Excel et d'autres formats via
tablib. Exportez directement les enregistrements, ou importez des données en masse via un assistant axé sur la prévisualisation qui applique une validation au niveau de chaque ligne et prend en charge les upserts optionnels de clés primaires. Voir Export et Import. - Widgets de tableau de bord : cartes statistiques, ApexCharts et grilles de mise en page se combinent pour former des index pages et des custom views, si bien que vous n'avez besoin d'aucun package de thème externe pour construire un dashboard. Voir Custom Views et Widgets.
- Interface utilisateur moderne : Tabler (Bootstrap 5) vous offre le mode sombre, les bascules de visibilité des colonnes et la surlignage des résultats de recherche par défaut.
Ce que vous devez apporter vous-même
- Authentification : il n'existe ni modèle utilisateur ni base de permissions intégrés. Implémentez
AuthProvider.authenticate()sur le magasin de données qu'utilise déjà votre application. - Journalisation d'audit : starlette-admin ne génère pas de table
LogEntry. Branchez le système d'événements sur votre propre table d'audit. - Configuration UI au niveau du modèle : les commodités de Django telles que les
choices,verbose_nameet validateurs au niveau du modèle ne se transfèrent pas. Déclarez-les plutôt sur le champ starlette-admin, avecEnumField,label=etvalidators=.