[PYTHON] Was ist ein Hund? Django - Erstellen Sie ein benutzerdefiniertes Benutzermodell

Benutzerregistrierungs- / Anmelde- / Abmeldefunktionen hinzugefügt

Hallo! Dies ist Ponta, ein Shiba-Hund. Es ist heute heiß, also habe ich den Soda-Geschmack gegessen. Es war wahnsinnig lecker! Garigari-Kun wird von einer Firma in der Präfektur Saitama hergestellt. Ponta war noch nie in der Präfektur Saitama.

Nun, heute werde ich die Benutzerverwaltungsfunktion herausfordern.

Konto-App erstellen

Erstellen Sie zunächst eine Kontoanwendung.

terminal


(venv_dog) Ponta@shiba_app # python manage.py startapp accounts

Registrieren Sie die Anwendung nach dem Erstellen in INSTALLED_APPS unter shiba_app / settings.py. Pontas INSTALLED_APPS sieht folgendermaßen aus:

shiba_app/settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'top.apps.TopConfig',
    'wan.apps.WanConfig',
    'accounts.apps.AccountsConfig',
]

Letzte 'accounts.apps.AccountsConfig', Hinzugefügt.

Andere Einstellungen in shiba_app / settings.py

In settings.py sind einige Einstellungen für die Benutzerregistrierungs- / Authentifizierungsfunktion erforderlich. Senden und empfangen Sie zunächst E-Mails zur Überprüfung der E-Mail-Adresse, die auf der Konsole in der Entwicklungsumgebung angezeigt wird. Die Einstellung hierfür ist EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' ist.

Lassen Sie Django als Nächstes auf das benutzerdefinierte Benutzermodell verweisen. AUTH_USER_MODEL = 'accounts.CustomUser' Einstellen.

Zusätzlich wird für Django-Allauth, das unten beschrieben wird, SITE_ID = 1 Einstellen.

Auch die Einstellungen für das Authentifizierungs-Backend AUTHENTICATION_BACKENDS = ( 'allauth.account.auth_backends.AuthenticationBackend', 'django.contrib.auth.backends.ModelBackend', ) ist. allauth.account.auth_backends.AuthenticationBackend Ist ein Authentifizierungs-Backend für allgemeine Benutzer, um sich mit E-Mail-Adressauthentifizierung anzumelden. django.contrib.auth.backends.ModelBackend Ist ein Authentifizierungs-Backend, mit dem sich Superuser mit ihrem Benutzernamen bei der Admin-Site anmelden können.

ACCOUNT_AUTHENTICATION_METHOD = 'email' Stellen Sie die E-Mail-Adressüberprüfung ein. ACCOUNT_USERNAME_REQUIRED = True Der Benutzername wird in benötigt.

ACCOUNT_EMAIL_VERIFICATION = 'mandatory' ACCOUNT_EMAIL_REQUIRED = True Es ist obligatorisch, Ihre E-Mail-Adresse zu bestätigen.

LOGIN_REDIRECT_URL = 'wan:index' Umleiten Sie nach dem Anmelden mit zum Index der WAN-Anwendung und ACCOUNT_LOGOUT_REDIRECT_URL = 'top:index' Umleiten Sie nach dem Abmelden mit zum Index der obersten Anwendung.

ACCOUNT_LOGOUT_ON_GET = True Ist eine Einstellung zum Abmelden unmittelbar nach dem Klicken auf die Schaltfläche Abmelden.

shiba_app/settings.py


EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

AUTH_USER_MODEL = 'accounts.CustomUser'

SITE_ID = 1

AUTHENTICATION_BACKENDS = (
    'allauth.account.auth_backends.AuthenticationBackend',
    'django.contrib.auth.backends.ModelBackend',
)

ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_USERNAME_REQUIRED = True

ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_EMAIL_REQUIRED = True

LOGIN_REDIRECT_URL = 'wan:index'
ACCOUNT_LOGOUT_REDIRECT_URL = 'top:index'

ACCOUNT_LOGOUT_ON_GET = True

Definieren eines benutzerdefinierten Benutzermodells

Django definiert ein Standardbenutzermodell, aber Sie können es überschreiben, um ein benutzerdefiniertes Benutzermodell zu definieren.

account/models.py


rom django.contrib.auth.models import AbstractUser
from django.db import models


class CustomUser(AbstractUser):

    class Meta:
        verbose_name_plural = 'CustomUser'

    dogname = models.CharField(verbose_name='Dog Name', blank=False, max_length=40)
    introduction = models.TextField(verbose_name='Introduction', blank=True)

Ich habe Dogname und Einführung hinzugefügt. Ich möchte diese Eingabebildschirme später erstellen, wenn ich eine Chance habe.

Migration

terminal


(venv_dog) Ponta@shiba_app # python manage.py makemigrations
Migrations for 'accounts':
  accounts/migrations/0001_initial.py
    - Create model CustomUser

Process finished with exit code 0

(venv_dog) Ponta@shiba_app # python manage.py migrate
Operations to perform:
  Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying accounts.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying sessions.0001_initial... OK
(venv_dog) Ponta@shiba_app # 

Installation von Django-Allauth

Da es schwierig ist, eine Benutzerauthentifizierungsfunktion zu erstellen, verwenden wir ein Paket namens django-allauth.

terminal


(venv_dog) Ponta@shiba_app # pip install django-allauth

In INSTALLED_APPS in settings.py, um Django-allauth für Ihre Anwendung verfügbar zu machen 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', Fügen Sie 4 Zeilen hinzu.

shiba_app/settings.py


INSTALLED_APPS = [
(Unterlassung)
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
]

Migrieren Sie erneut

Führen Sie den Befehl migrate erneut aus, um die von django-allauth verwendete Tabelle zu erstellen.

terminal


(venv_dog) Ponta@shiba_app # python manage.py migrate       
Operations to perform:
  Apply all migrations: account, accounts, admin, auth, contenttypes, sessions, sites, socialaccount
Running migrations:
  Applying account.0001_initial... OK
  Applying account.0002_email_max_length... OK
  Applying sites.0001_initial... OK
  Applying sites.0002_alter_domain_unique... OK
  Applying socialaccount.0001_initial... OK
  Applying socialaccount.0002_token_max_lengths... OK
  Applying socialaccount.0003_extra_data_default_dict... OK

Einen Superuser erstellen

Erstellen Sie einen Superuser, um auf den Django-Verwaltungsbildschirm zuzugreifen.

terminal


(venv_dog) Ponta@shiba_app # python manage.py createsuperuser 
Username: ponta
Email address: [email protected]
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: N
Password: 
Password (again): 
Superuser created successfully.

Hoppla, die Passwortüberprüfung scheint hängen zu bleiben, wenn das Passwort zu kurz oder zu einfach ist. Das zweite Mal habe ich es ernst genommen.

Melden Sie sich beim Verwaltungsbildschirm an

Nachdem Sie einen Superuser erstellt haben, melden Sie sich beim Django-Verwaltungsbildschirm an. http://127.0.0.1:8000/admin/ Zugreifen. Dann http://127.0.0.1:8000/admin/login/?next=/admin/ Ich wurde zu weitergeleitet und der Anmeldebildschirm wurde angezeigt.

スクリーンショット 2020-08-30 18.22.33.png

Geben Sie hier den Benutzernamen und das Passwort ein, mit denen Sie den Superuser zum Anmelden erstellt haben. Dann konnte ich mich wie unten gezeigt erfolgreich anmelden und der Verwaltungsbildschirm wurde angezeigt.

スクリーンショット 2020-08-30 18.22.55.png

Routing-Einstellungen shiba_app / urls.py

Derzeit wurden drei Anwendungen (Top, WAN, Konten) in shiba_app erstellt.

shiba_app/urls.py


from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('top.urls')),
    path('wan/', include('wan.urls')),
    path('accounts/', include('allauth.urls')),
]

Routing-Einstellungen top / urls.py.

top/urls.py


from django.urls import path
from . import views

app_name = 'top'

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]

Routing-Einstellungen wan / urls.py.

wan/urls.py


from django.urls import path
from . import views

app_name = 'wan'

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]

Bildschirmeinstellungen top / views.py

top/views.py


from django.views import generic


class IndexView(generic.TemplateView):
    template_name = "top/index.html"

Bildschirmeinstellungen wan / views.py

wan/views.py


from django.views import generic


class IndexView(generic.TemplateView):
    template_name = "wan/index.html"

Bildschirmvorlage top / index.html

Der Benutzername und die Abmeldeschaltfläche werden während der Anmeldung angezeigt, und die Benutzerregistrierungsschaltfläche und die Anmeldeschaltfläche werden während der Abmeldung angezeigt.

top/templates/top/index.html


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>Shiba Inu Pontas "Was ist ein Hund?"</title>
</head>
<body>
	<h1>Shiba Inu Pontas "Was ist ein Hund?"</h1>
	<p>Dies ist Ponta, ein Shiba-Hund. Grüße Eins!</p>
	{% if user.is_authenticated %}
		<p>Nutzername:{{ user }}</p>
		<p><a href="{% url 'account_logout' %}">Ausloggen</a> </p>
	{% else %}
		<p><a href="{% url 'account_signup' %}">Benutzer Registration</a></p>
		<p><a href="{% url 'account_login' %}">Einloggen</a></p>
	{% endif %}
</body>
</html>

Bildschirmvorlage wan / index.html

Der Benutzername und die Abmeldeschaltfläche werden während der Anmeldung angezeigt, und die Benutzerregistrierungsschaltfläche und die Anmeldeschaltfläche werden während der Abmeldung angezeigt. (Eh! Wie vorher ??)

wan/templates/wan/index.html


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>Shiba Inu Pontas "Was ist ein Hund?"</title>
</head>
<body>
	<h1>Shiba Inu Pontas "Was ist ein Hund?"</h1>
	{% if user.is_authenticated %}
		<p>Nutzername:{{ user }}</p>
		<p><a href="{% url 'account_logout' %}">Ausloggen</a> </p>
	{% else %}
		<p><a href="{% url 'account_signup' %}">Benutzer Registration</a></p>
		<p><a href="{% url 'account_login' %}">Einloggen</a></p>
	{% endif %}
</body>
</html>

Benutzerregistrierungstest

Lassen Sie uns nun die obere Seite überprüfen.

スクリーンショット 2020-08-30 21.59.52.png

Klicken Sie auf Benutzerregistrierung. スクリーンショット 2020-08-30 20.46.29.png

Registrieren Sie einen Benutzer zum Testen. スクリーンショット 2020-08-30 20.46.38.png

Eine E-Mail wurde gesendet. Da es sich jetzt um einen Test handelt, wird eine E-Mail-Nachricht an die Konsole (Terminalbildschirm) gesendet.

terminal


[30/Aug/2020 11:45:57] "GET /accounts/signup/ HTTP/1.1" 200 1330
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [example.com] Please Confirm Your E-mail Address
From: webmaster@localhost
To: [email protected]
Date: Sun, 30 Aug 2020 11:46:30 -0000
Message-ID: (Kürzung)

Hello from example.com!

You're receiving this e-mail because user Lisa has given yours as an e-mail address to connect their account.

To confirm this is correct, go to http://127.0.0.1:8000/accounts/confirm-email/NA:1kCLn4:g2Po76yr88dimfzO641FunQcGbYPexyYkTE4j0JLZ4Q/

Thank you from example.com!
example.com
-------------------------------------------------------------------------------
[30/Aug/2020 11:46:30] "POST /accounts/signup/ HTTP/1.1" 302 0

In der Mitte dieser Anzeige, "http://127.0.0.1:8000/accounts/confirm-email/NA:1kCLn4:g2Po76yr88dimfzO641FunQcGbYPexyYkTE4j0JLZ4Q/" Die E-Mail-Authentifizierung ist abgeschlossen, wenn Sie darauf zugreifen.

スクリーンショット 2020-08-30 20.55.21.png

Melden wir uns an, nachdem die E-Mail-Überprüfung abgeschlossen ist.

スクリーンショット 2020-08-30 20.56.59.png

Nach dem Anmelden wird der folgende Bildschirm angezeigt.

スクリーンショット 2020-08-30 20.57.53.png

Wenn Sie sich abmelden, kehren Sie zum ersten Bildschirm zurück.

スクリーンショット 2020-08-30 21.59.52.png

Das ist es. Wir sehen uns! einer!

Recommended Posts

Was ist ein Hund? Django - Erstellen Sie ein benutzerdefiniertes Benutzermodell
Was ist ein Hund? Django - Erstellen Sie ein benutzerdefiniertes Benutzermodell 2
Was ist ein Superuser?
Benutzer wird nach dem Erstellen eines benutzerdefinierten Benutzermodells nicht erfolgreich hinzugefügt
Was ist ein Hund? Django-Installationsvolumen
Was ist ein Hund? Python-Installationsvolumen
Implementieren Sie ein benutzerdefiniertes Benutzermodell in Django
Was ist eine Distribution?
Was ist ein Hund? Fordern Sie die Django-Vorlage heraus! Volumen
Was ist ein Terminal?
Was ist ein Hacker?
Was ist ein Zeiger?
Was ist ein Hund? POST-Übertragungsvolumen mit Django--forms.py
Was ist ein Hund? Startvolumen der Django-App erstellen --startapp
Was ist ein Hund? Django App Creation Start Volume - Startprojekt
Was ist ein Entscheidungsbaum?
Was ist ein Kontextwechsel?
Was ist ein Systemaufruf?
[Definition] Was ist ein Framework?
Was ist eine Rückruffunktion?
[Python] Was ist eine Zip-Funktion?
[Python] Was ist eine with-Anweisung?
Was ist ein lexikalischer / dynamischer Bereich?
Was ist das Convolutional Neural Network?
[Mein Memo] Djangos benutzerdefiniertes Benutzermodell
Was ist ein Hund? Volumen der GET-Anforderungen und Abfrageparameter
Was ist ein Hund? Django - Umfang, in dem Name und Datum von der URL abgerufen werden
Es ist ein Mac. Was ist der Linux-Befehl Linux?
Sag mir, was eine gleichwinklige Abbildung ist, Python!
Was ist ein Namespace?
Was ist copy.copy ()
Was ist Django? .. ..
Was ist dotenv?
Was ist POSIX?
Was ist ein Hund? Django - Umfang der Verwendung von Werten, die von der URL in der klassenbasierten Ansicht erhalten wurden
Was ist Linux?
Was ist klass?
Was ist SALOME?
Was ist Linux?
Was ist Python?
Was ist Hyperopt?
Was ist Linux?
Was ist Pyvenv?
Was ist __call__?
Was ist Linux?
Was ist Python?
Was ist ein empfohlener Motor? Zusammenfassung der Typen
Was ist Gott? Erstelle einen einfachen Chatbot mit Python
Für mich als Django-Anfänger (2) - Was ist MTV?
Was ist ein Hund? Django - Versuchen Sie zum ersten Mal, Form zu verwenden. POST-Übertragungsvolumen