Découvrir Django, partie 2
Dans la première partie, j'ai montré comment démarrer un nouveau projet sur Django, ainsi que définir de nouveaux modèles et ajouter des modèles existants.
Cette fois, je vous présenterai un panneau d'administration, qui est disponible dès le départ, et comment il peut être utile.
Remarque importante : ne vous attendez pas à ce que si vous essayez de répéter les actions de cet article, cela fonctionnera pour vous, ce n'est pas le cas. Au cours de l'article, j'ai dû faire quelques corrections dans le projet django-iris, et même dans le pilote DB-API fait par InterSystems pour corriger certains problèmes là aussi, et je pense que ce pilote est encore en développement, et nous aurons un pilote plus stable dans le futur. Considérons que cet article ne fait qu'expliquer comment cela pourrait être si nous avions tous fait.
Revenons à notre code et voyons ce que nous avons dans urls.py, qui est le principal point d'entrée de toutes les requêtes web."""main URL Configuration
La liste `urlpatterns` dirige les URLs vers les visualisations. Pour plus d'informations, veuillez consulter :
https://docs.djangoproject.com/en/4.0/topics/http/urls/
Exemples :
Visualisations des fonctions
1. Ajoutez un import : from my_app import views
2. Ajouter une URL à urlpatterns : path('', views.home, name='home')
Visualisations basées sur des classes
1. Ajoutez un import : from other_app.views import Home
2. Ajouter une URL à urlpatterns : path('', Home.as_view(), name='home')
En incluant une autre URLconf
1. Importez la fonction include() : from django.urls import include, path
2. Ajoutez une URL à urlpatterns : path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
Comme vous pouvez le constater, l'URL admin y est déjà définie
Lançons le serveur de développement, par la commande
python manage.py runserver
Si vous passez par l'URL http://localhost:8000/admin, vous trouverez le formulaire de connexion à l'administration de Django
.png)
Pour entrer ici, nous avons besoin d'un utilisateur, et nous pouvons le créer avec cette commande
$ python manage.py createsuperuser
Nom d'utilisateur (laissez vide pour utiliser 'daimor') : admin
Adresse e-mail : admin@example.com
Mot de passe :
Mot de passe ( de nouveau) :
Le mot de passe est trop similaire au nom d'utilisateur.
Ce mot de passe est trop court. Il doit contenir au moins 8 caractères.
Ce mot de passe est trop courant.
Contourner la validation du mot de passe et créer un utilisateur quand même ? [O/N] : O
Le superutilisateur a été créé avec succès.Nous pouvons maintenant utiliser ce nom d'utilisateur et ce mot de passe. Il est assez vide pour le moment, mais il donne déjà accès aux groupes et aux utilisateurs.
.png)
Plus de données
Précédemment j'ai déjà installé le paquet post-and-tags avec zpm, vous pouvez le faire aussi
zpm "install posts-and-tags"Maintenant nous pouvons obtenir les modèles pour tous les tableaux (community.post, community.comment, community.tag) installés par ce paquet
$ python manage.py inspectdb community.post community.comment community.tag > main/models.py
Le fichier sera un peu long, donc, je l'ai mis dans un spoiler
# This is an auto-generated Django model module.# Vous devrez effectuer les opérations suivantes manuellement pour nettoyer tout cela :# * Réorganiser les modèles' order# * Assurez-vous que chaque modèle a un champ avec primary_key=True# * Assurez-vous que chaque ForeignKey et OneToOneField a `on_delete` réglé sur la valeur désirée behavior# * Supprimez les lignes `managed = False` si vous souhaitez autoriser Django à créer, modifier et supprimer la table# N'hésitez pas à renommer les modèles, mais ne renommez pas les valeurs de db_table ou les noms de champs.from django.db import models
classCommunityPost(models.Model):
acceptedanswerts = models.DateTimeField(db_column='AcceptedAnswerTS', blank=True, null=True) # Nom du champ en minuscules.
author = models.CharField(db_column='Author', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
avgvote = models.IntegerField(db_column='AvgVote', blank=True, null=True) # Nom du champ en minuscules.
commentsamount = models.IntegerField(db_column='CommentsAmount', blank=True, null=True) # Nom du champ en minuscules.
created = models.DateTimeField(db_column='Created', blank=True, null=True) # Nom du champ en minuscules.
deleted = models.BooleanField(db_column='Deleted', blank=True, null=True) # Nom du champ en minuscules.
favscount = models.IntegerField(db_column='FavsCount', blank=True, null=True) # Nom du champ en minuscules.
hascorrectanswer = models.BooleanField(db_column='HasCorrectAnswer', blank=True, null=True) # Nom du champ en minuscules.
hash = models.CharField(db_column='Hash', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
lang = models.CharField(db_column='Lang', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
name = models.CharField(db_column='Name', max_length=250, blank=True, null=True) # Nom du champ en minuscules.
nid = models.IntegerField(db_column='Nid', primary_key=True) # Nom du champ en minuscules.
posttype = models.CharField(db_column='PostType', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
published = models.BooleanField(db_column='Published', blank=True, null=True) # Nom du champ en minuscules.
publisheddate = models.DateTimeField(db_column='PublishedDate', blank=True, null=True) # Nom du champ en minuscules.
subscount = models.IntegerField(db_column='SubsCount', blank=True, null=True) # Nom du champ en minuscules.
tags = models.CharField(db_column='Tags', max_length=350, blank=True, null=True) # Nom du champ en minuscules.
text = models.TextField(db_column='Text', blank=True, null=True) # Nom du champ en minuscules.
translated = models.BooleanField(db_column='Translated', blank=True, null=True) # Nom du champ en minuscules.
type = models.CharField(db_column='Type', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
views = models.IntegerField(db_column='Views', blank=True, null=True) # Nom du champ en minuscules.
votesamount = models.IntegerField(db_column='VotesAmount', blank=True, null=True) # Nom du champ en minuscules.classMeta:
managed = False
db_table = 'community.post'classCommunityComment(models.Model):
id1 = models.CharField(db_column='ID1', primary_key=True, max_length=62) # Nom du champ en minuscules.
acceptedanswerts = models.DateTimeField(db_column='AcceptedAnswerTS', blank=True, null=True) # Nom du champ en minuscules.
author = models.CharField(db_column='Author', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
avgvote = models.IntegerField(db_column='AvgVote', blank=True, null=True) # Nom du champ en minuscules.
correct = models.BooleanField(db_column='Correct', blank=True, null=True) # Nom du champ en minuscules.
created = models.DateTimeField(db_column='Created', blank=True, null=True) # Nom du champ en minuscules.
hash = models.CharField(db_column='Hash', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
id = models.IntegerField(db_column='Id') # Nom du champ en minuscules.
post = models.CharField(db_column='Post', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
text = models.TextField(db_column='Text', blank=True, null=True) # Nom du champ en minuscules.
texthash = models.CharField(db_column='TextHash', max_length=50, blank=True, null=True) # Nom du champ en minuscules.
type = models.CharField(db_column='Type', max_length=50) # Nom du champ en minuscules.
votesamount = models.IntegerField(db_column='VotesAmount', blank=True, null=True) # Nom du champ en minuscules.classMeta:
managed = False
db_table = 'community.comment'
unique_together = (('type', 'id'),)
classCommunityTag(models.Model):
description = models.TextField(db_column='Description', blank=True, null=True) # Nom du champ en minuscules.
name = models.TextField(db_column='Name', primary_key=True) # Nom du champ en minuscules.classMeta:
managed = False
db_table = 'community.tag'
Le tableau de bord d'administration en Django peut être étendu par le développeur. Il est ainsi possible d'ajouter des tableaux supplémentaires. Pour ce faire, nous devons ajouter un nouveau fichier nommé main/admin.py. J'ai ajouté quelques commentaires dans le code, pour expliquer certaines lignes.
from django.contrib import admin
# Importation de nos modèles communautaires pour nos tableaux dans IRISfrom .models import (CommunityPost, CommunityComment, CommunityTag)
# classe de registre qui remplace le comportement par défaut du modèle CommunityPost@admin.register(CommunityPost)classCommunityPostAdmin(admin.ModelAdmin):# liste des propriétés à afficher dans le tableau view
list_display = ('posttype', 'name', 'publisheddate')
# liste des propriétés pour lesquelles il faut afficher un filtre à la droite du tableau
list_filter = ('posttype', 'lang', 'published')
# ordre par défaut, c'est-à-dire à partir de la date la plus récente de PublishedDate
ordering = ['-publisheddate', ]
@admin.register(CommunityComment)classCommunityCommentAdmin(admin.ModelAdmin):# seuls ces deux champs apparaissent, ( le post est numérique par id dans le tableau post)
list_display = ('post', 'created')
# classées par date de création
ordering = ['-created', ]
@admin.register(CommunityTag)classCommunityTagAdmin(admin.ModelAdmin):# pas tellement à montrer
list_display = ('name', )
Portail d'extension
Retournons à notre page d'administration de Django, et examinons les nouveaux éléments qui y ont été ajoutés
.png)
Sur le côté droit, vous verrez le panneau de filtrage, et ce qui est important, c'est qu'il contient toutes les valeurs possibles dans des champs particuliers et qu'il les affiche.
Malheureusement, InterSystems SQL ne permet pas d'utiliser les fonctions LIMIT, OFFSET, attendues d'une manière ou d'une autre par Django. Par ailleurs, Django ne permet pas d'utiliser la fonction TOP. Ainsi, la pagination sera affichée ici mais ne fonctionnera pas. Et il n'y a aucun moyen de la faire fonctionner pour le moment, et je ne pense pas que cela fonctionnera un jour, malheureusement.
Vous pouvez même plonger dans l'objet, et Django affichera le formulaire, avec les types de champs corrects. ( remarque : Cet ensemble de données ne contient pas de données dans le champ Texte)
.png)
.png)
Objet du commentaire
.png)
<p>
<img src="/sites/default/files/inline/images/images/image(4239).png" />
</p>
<p>
Même quand IRIS dit qu'il vous reste plus des places
</p>
<p>
<img src="/sites/default/files/inline/images/images/image(4240).png" />
</p>
<p>
Il n'autorise pas plus de 5 connexions, il faut donc terminer un ou plusieurs processus pour que cela fonctionne, ou redémarrer le serveur Django
</p>
<p>
<img src="/sites/default/files/inline/images/images/image(4241).png" />
</p>
<p>
Dans le cadre du développement, vous pouvez également limiter le serveur Django à un mode sans threads, afin qu'il fonctionne dans un seul processus. Et il ne devrait pas obtenir plus de connexions à IRIS
</p>
<pre>python manage.py runserver --nothreading</pre>