TL;DR Fortsetzung von Amateur-Infrastrukturingenieur, der Django mit Docker berührt (2): Erstellen eines Modells. Wenn Sie von 1 lesen möchten, ↓ hier. Amateur-Infrastrukturingenieur berührt Django mit Docker (1): Machen Sie Django mit Docker Auch dieses Mal werde ich mit Django spielen, während ich eine Probe von [Django Girls] mache (https://tutorial.djangogirls.org/ja/). Da ich das letzte Mal ein Modell erstellt habe, möchte ich dieses Mal zu Ansicht und Vorlage gehen, aber zuerst lerne ich die Administrationssite (admin) zum Verwalten von Django-Modellen. Um bis zur Benutzererstellung der Verwaltungssite mit Docker-Compose ausführen zu können, muss ein erweiterter Befehl erstellt werden, damit der Erstellungsbefehl createuperuser mit einem Liner ausgeführt werden kann, was ebenfalls beschrieben wird.
Django admin Django hat standardmäßig eine Seite namens admin, um das erstellte Modell mit der GUI zu verwalten. Dieses Mal werden wir uns die Aktivierung und Verwendung ansehen.
admin.py Bearbeiten Sie wie folgt.
blog/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
Da die erste Zeile von Anfang an enthalten ist, werden die anderen Zeilen hinzugefügt.
from django.contrib import admin
Anwendungsmodul für Admin-Site. Obwohl ich es das letzte Mal nicht erwähnt habe, wird "django.contrib.admin" standardmäßig auch in "INSTALLED_APPS" in "settings.py" aufgeführt, wo ich die von mir erstellte Anwendung hinzugefügt habe, damit sie von Anfang an verwendet werden kann. Es ist geworden.
from .models import Post
Das Post-Modell wird aus models.py aufgerufen, das im selben Verzeichnis gespeichert ist.
admin.site.register(Post)
Sie können ein Modell unter der Kontrolle der Admin-Site mit "admin.site.register (Model)" hinzufügen.
Schauen wir uns nun die Admin-Site im laufenden Container an.
(Docker-compose up
braucht keine Leute, die seit dem letzten Mal gelaufen sind.)
docker-compose up
Das Folgende wird von einem anderen Terminal ausgeführt. Beim letzten Mal habe ich "python manage.py migrate blog" ausgeführt, um nur Migrationen unter dem Blog-Verzeichnis zu migrieren. Dieses Mal habe ich jedoch auch das Administratormodell migriert, indem ich es ohne Argument ausgeführt habe.
docker-compose exec web bash
python manage.py migrate
exit
Greifen Sie auf "http: // IPADDRESS: 8000 / admin" zu
Der Anmeldebildschirm wird geöffnet. Der hier einzugebende Login-Benutzer muss erstellt werden, indem der Befehl mit migrate.py
auf die gleiche Weise wie bei der DB-Migration ausgeführt wird.
docker-compose exec web bash
python manage.py createsuperuser
exit
Wenn ich "createuperuser" starte, erhalte ich eine Eingabeaufforderung. Wenn Sie den Benutzernamen, die E-Mail-Adresse und das Kennwort eingeben, wird die Ausgabe "Superuser erfolgreich erstellt" ausgegeben. Geben Sie die hier eingegebenen Informationen auf dem Anmeldebildschirm ein.
Ich konnte mich einloggen.
Klicken Sie auf Beiträge. Da das POST-Modell das letzte Mal definiert und die Tabelle erstellt wurde, wird es natürlich als 0 Beiträge angezeigt. Es scheint, dass Sie Daten mit der Schaltfläche POST HINZUFÜGEN einfügen können. Versuchen Sie also, sie zu drücken. Wie beim letzten Mal in models.py definiert, gibt es Textfelder und Pulldown-Listen zur Eingabe. Ich werde eine als Testversion veröffentlichen. Ich konnte die Daten sicher hinzufügen. Gehen Sie in den Datenbankcontainer und prüfen Sie, ob er den Datensatz tatsächlich enthält.
docker-compose exec db bash
psql -U postgres
SELECT * FROM blog_post;
SELECT Ausführungsergebnis
id | title | text | created_date | published_date | author_id
----+-------+--------------------+------------------------+------------------------+-----------
1 | TEST | This is test post. | 2020-05-02 07:47:14+00 | 2020-05-02 07:47:26+00 | 2
(1 row)
Ich konnte bestätigen, dass die Aufzeichnungen ordnungsgemäß gespeichert wurden. Sie können Datensätze auf demselben Bildschirm erstellen, aktualisieren und löschen.
Bisher habe ich mich nur zu Überprüfungszwecken mit "docker-compose exec" in den Container eingeloggt. Wenn möglich, wäre es jedoch klüger, mit Docker-compose sofort auf diesen Punkt aufzubauen.
①DB migrate
Für die Migration müssen Sie nur einen Befehl eingeben, damit Sie ihn verarbeiten können, indem Sie command:
in docker-compose.yaml wie unten gezeigt umschreiben. (Bei der Migration wird nur eine Migrationsdatei erstellt, sodass Sie diese nicht benötigen, wenn Sie bereits eine haben.)
docker-compose.yaml
command: sh -c "sleep 5; python manage.py migrate; python manage.py runserver 0.0.0.0:8000"
Ich habe 5 Sekunden geschlafen, bevor ich die Migration ausgeführt habe, aber ich habe sie hinzugefügt, da manchmal ein Fehler aufgrund eines Problems mit dem Startzeitpunkt von Postgres auftritt.
②createsuperuser Da Superuser-Prozesse zur Laufzeit interaktiv erstellt werden, kann Docker-Compose dies nur verarbeiten, wenn es mit einem einzelnen Liner ausgeführt werden kann. Wenn ich gegoogelt habe, scheint manage.py in der Lage zu sein, die Befehle zu erweitern, indem ein Ordner namens "management / command" erstellt und eine Python-Datei hinzugefügt wird. https://stackoverflow.com/questions/6244382/how-to-automate-createsuperuser-on-django https://docs.djangoproject.com/en/1.8/howto/custom-management-commands/ Verwenden Sie diese Option, um optional einen Benutzernamen und ein Kennwort zu erhalten und einen benutzerdefinierten Einzeilerbefehl zu erstellen.
cd blog
mkdir -p management/commands
touch management/__init__.py
touch management/commands/__init__.py
createcustomsuperuser.py
management/commands/createcustomsuperuser.py
from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError
class Command(createsuperuser.Command):
help = 'Crate a superuser, and allow password to be provided'
def add_arguments(self, parser):
super().add_arguments(parser)
parser.add_argument(
'--password', dest='password', default=None,
help='Specifies the password for the superuser.',
)
def handle(self, *args, **options):
password = options.get('password')
username = options.get('username')
database = options.get('database')
if password and not username:
raise CommandError("--username is required if specifying --password")
super().handle(*args, **options)
if password:
user = self.UserModel._default_manager.db_manager(database).get(username=username)
user.set_password(password)
user.save()
from django.contrib.auth.management.commands import createsuperuser
Importieren Sie dieses Mal, um den Befehl von createsuperuser zu erweitern.
from django.core.management import CommandError
Befehlsfehler, den Django hat. Dieses Mal wird es verwendet, um einen Fehler zurückzugeben, wenn nicht genügend Argumente vorhanden sind.
class Command(createsuperuser.Command):
help = 'Crate a superuser, and allow password to be provided'
Der Wortlaut, der beim Aufrufen der Hilfe mit "--help" oder "-h" angezeigt wird, wurde hinzugefügt.
def add_arguments(self, parser):
super().add_arguments(parser)
parser.add_argument(
'--password', dest='password', default=None,
help='Specifies the password for the superuser.',
)
Eine Funktion, die Befehlsargumente hinzufügt. super (). Add_arguments (Parser)
wird ausgeführt, um auch das Argument des ursprünglichen createduperuser
hinzuzufügen. Es wurde ein Argument namens Kennwort hinzugefügt, das vom ursprünglichen Erstellungssuperuser nicht akzeptiert wurde.
def handle(self, *args, **options):
password = options.get('password')
username = options.get('username')
database = options.get('database')
if password and not username:
raise CommandError("--username is required if specifying --password")
super().handle(*args, **options)
if password:
user = self.UserModel._default_manager.db_manager(database).get(username=username)
user.set_password(password)
user.save()
Der eigentliche Verarbeitungsteil. Der Benutzer, der mit dem herkömmlichen Erstellungs-Superuser-Prozess erstellt wurde, wird von db aus durchsucht, und das Kennwort wird festgelegt und gespeichert.
Schreiben Sie nach dem Erstellen dieser Datei docker-compose.yaml wie folgt neu.
docker-compose.yaml
command: sh -c "sleep 5; python manage.py migrate; python manage.py createcustomsuperuser --username root --password 123456 --noinput --email '[email protected]'; python manage.py runserver 0.0.0.0:8000"
(Passwort ist ein Beispiel) Auf diese Weise scheint es gut zu sein, in docker-compose.yaml schreiben zu können, wenn Sie es im Manifest in Secret angeben, auch wenn Sie zu Kubernetes migrieren.
Bitte stellen Sie sicher, dass der Vorgang bis zu diesem Punkt in einer Zeile "Docker-Compose Up" abgeschlossen ist.
docker-compose up
Nächstes Mal werde ich lernen, wie man urls.py schreibt. (Wann wirst du eine Ansicht schreiben?)
Recommended Posts