[PYTHON] Qu'est-ce qu'un chien? Django - Créer un modèle utilisateur personnalisé

Ajout de fonctions d'enregistrement / connexion / déconnexion de l'utilisateur

Bonjour un! Voici Ponta, un chien Shiba. Il fait chaud aujourd'hui, alors j'ai mangé la saveur de soda. C'était incroyablement délicieux! Garigari-kun est fabriqué par une entreprise de la préfecture de Saitama. Ponta n'est jamais allé dans la préfecture de Saitama.

Eh bien, aujourd'hui, je vais contester la fonction de gestion des utilisateurs.

Créer une application de compte

Tout d'abord, créez une application de compte.

terminal


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

Après avoir créé l'application, enregistrez-la dans INSTALLED_APPS dans shiba_app / settings.py. INSTALLED_APPS de Ponta ressemble à ceci:

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',
]

Dernier 'accounts.apps.AccountsConfig', Ajoutée.

Autres paramètres dans shiba_app / setting.py

Certains paramètres sont requis dans settings.py pour la fonction d'enregistrement / d'authentification de l'utilisateur. Tout d'abord, envoyez et recevez des e-mails pour la vérification de l'adresse e-mail, qui s'affiche sur la console dans l'environnement de développement. Le paramètre pour cela est EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' est.

Ensuite, laissez Django référencer le modèle utilisateur personnalisé, AUTH_USER_MODEL = 'accounts.CustomUser' Mettre en place.

De plus, pour django-allauth décrit ci-dessous, SITE_ID = 1 Mettre en place.

En outre, les paramètres du backend d'authentification AUTHENTICATION_BACKENDS = ( 'allauth.account.auth_backends.AuthenticationBackend', 'django.contrib.auth.backends.ModelBackend', ) est. allauth.account.auth_backends.AuthenticationBackend Est un backend d'authentification permettant aux utilisateurs généraux de se connecter avec l'authentification par adresse e-mail, django.contrib.auth.backends.ModelBackend Est un backend d'authentification permettant aux super utilisateurs de se connecter au site d'administration avec leur nom d'utilisateur.

ACCOUNT_AUTHENTICATION_METHOD = 'email' Alors, définissez-le sur la vérification de l'adresse e-mail, ACCOUNT_USERNAME_REQUIRED = True Le nom d'utilisateur est obligatoire dans.

ACCOUNT_EMAIL_VERIFICATION = 'mandatory' ACCOUNT_EMAIL_REQUIRED = True Il est obligatoire de confirmer votre adresse e-mail.

LOGIN_REDIRECT_URL = 'wan:index' Après vous être connecté avec, redirigez vers l'index de l'application wan et ACCOUNT_LOGOUT_REDIRECT_URL = 'top:index' Après vous être déconnecté avec, redirigez vers l'index de l'application principale.

ACCOUNT_LOGOUT_ON_GET = True Est un paramètre permettant de se déconnecter immédiatement après avoir cliqué sur le bouton de déconnexion.

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

Définition d'un modèle utilisateur personnalisé

Django définit un modèle utilisateur par défaut, mais vous pouvez le remplacer pour définir un modèle utilisateur personnalisé.

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)

J'ai ajouté dogname et introduction. J'aimerais faire ces écrans de saisie plus tard si j'ai une chance.

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 de django-allauth

Comme il est difficile de créer une fonction d'authentification utilisateur, nous utilisons un package appelé django-allauth.

terminal


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

Dans INSTALLED_APPS dans settings.py pour rendre Django-allauth disponible pour votre application 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', Ajoutez 4 lignes.

shiba_app/settings.py


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

Migrer à nouveau

Exécutez à nouveau la commande migrate pour créer la table utilisée par django-allauth.

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

Créer un super utilisateur

Créez un super utilisateur pour accéder à l'écran d'administration de Django.

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.

Oups, la validation du mot de passe semble être bloquée si le mot de passe est trop court ou trop facile. La deuxième fois, je l'ai mis au sérieux.

Connectez-vous à l'écran de gestion

Maintenant que vous avez créé un super utilisateur, essayez de vous connecter à l'écran d'administration de Django. http://127.0.0.1:8000/admin/ Accéder. Puis http://127.0.0.1:8000/admin/login/?next=/admin/ J'ai été redirigé vers et l'écran de connexion est apparu.

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

Entrez ici le nom d'utilisateur et le mot de passe que vous avez utilisés pour créer le super utilisateur pour vous connecter. Ensuite, j'ai pu me connecter avec succès comme indiqué ci-dessous et l'écran de gestion est apparu.

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

Paramètres de routage shiba_app / urls.py

Actuellement, trois applications (top, wan, comptes) ont été créées dans shiba_app.

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')),
]

Paramètres de routage 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'),
]

Paramètres de routage 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'),
]

Paramètres de l'écran top / views.py

top/views.py


from django.views import generic


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

Paramètres de l'écran wan / views.py

wan/views.py


from django.views import generic


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

Modèle d'écran top / index.html

Le nom d'utilisateur et le bouton de déconnexion s'affichent lors de la connexion, et le bouton d'enregistrement de l'utilisateur et le bouton de connexion s'affichent lors de la déconnexion.

top/templates/top/index.html


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>"Qu'est-ce qu'un chien?" De Shiba Inu Ponta?</title>
</head>
<body>
	<h1>"Qu'est-ce qu'un chien?" De Shiba Inu Ponta?</h1>
	<p>Voici Ponta, un chien Shiba. Cordialement!</p>
	{% if user.is_authenticated %}
		<p>Nom d'utilisateur:{{ user }}</p>
		<p><a href="{% url 'account_logout' %}">Se déconnecter</a> </p>
	{% else %}
		<p><a href="{% url 'account_signup' %}">Enregistrement de l'utilisateur</a></p>
		<p><a href="{% url 'account_login' %}">S'identifier</a></p>
	{% endif %}
</body>
</html>

Modèle d'écran wan / index.html

Le nom d'utilisateur et le bouton de déconnexion s'affichent lors de la connexion, et le bouton d'enregistrement de l'utilisateur et le bouton de connexion s'affichent lors de la déconnexion. (Eh! Comme avant ??)

wan/templates/wan/index.html


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>"Qu'est-ce qu'un chien?" De Shiba Inu Ponta?</title>
</head>
<body>
	<h1>"Qu'est-ce qu'un chien?" De Shiba Inu Ponta?</h1>
	{% if user.is_authenticated %}
		<p>Nom d'utilisateur:{{ user }}</p>
		<p><a href="{% url 'account_logout' %}">Se déconnecter</a> </p>
	{% else %}
		<p><a href="{% url 'account_signup' %}">Enregistrement de l'utilisateur</a></p>
		<p><a href="{% url 'account_login' %}">S'identifier</a></p>
	{% endif %}
</body>
</html>

Test d'enregistrement des utilisateurs

Maintenant, regardons la première page.

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

Cliquez sur Enregistrement de l'utilisateur. スクリーンショット 2020-08-30 20.46.29.png

Enregistrez un utilisateur pour le test. スクリーンショット 2020-08-30 20.46.38.png

Un e-mail a été envoyé. Puisqu'il s'agit d'un test maintenant, un message électronique sera envoyé à la console (écran du terminal).

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: (réduction)

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

Au milieu de cet affichage, "http://127.0.0.1:8000/accounts/confirm-email/NA:1kCLn4:g2Po76yr88dimfzO641FunQcGbYPexyYkTE4j0JLZ4Q/" L'authentification par e-mail est terminée lorsque vous y accédez.

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

Connectons-nous une fois la vérification des e-mails terminée.

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

Une fois connecté, l'écran suivant apparaît.

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

Lorsque vous vous déconnectez, vous revenez au premier écran.

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

C'est tout. À bientôt mon cher! un!

Recommended Posts

Qu'est-ce qu'un chien? Django - Créer un modèle utilisateur personnalisé
Qu'est-ce qu'un chien? Django - Créer un modèle utilisateur personnalisé 2
Qu'est-ce qu'un super utilisateur?
L'utilisateur n'est pas ajouté avec succès après la création d'un modèle d'utilisateur personnalisé
Qu'est-ce qu'un chien? Volume d'installation de Django
Qu'est-ce qu'un chien? Volume d'installation Python
Implémenter un modèle utilisateur personnalisé dans Django
Qu'est-ce qu'une distribution?
Qu'est-ce qu'un chien? Défiez le modèle Django! Le volume
Qu'est-ce qu'un terminal?
Qu'est-ce qu'un hacker?
Qu'est-ce qu'un pointeur?
Qu'est-ce qu'un chien? Volume de transmission POST à l'aide de Django--forms.py
Qu'est-ce qu'un chien? Volume de démarrage de la création de l'application Django --startapp
Qu'est-ce qu'un chien? Volume de démarrage de la création de l'application Django - startproject
Qu'est-ce qu'un arbre de décision?
Qu'est-ce qu'un changement de contexte?
Qu'est-ce qu'un appel système
[Définition] Qu'est-ce qu'un cadre?
Qu'est-ce qu'une fonction de rappel?
[Python] Qu'est-ce qu'une fonction zip?
[Python] Qu'est-ce qu'une instruction with?
Qu'est-ce qu'une portée lexicale / une portée dynamique?
Qu'est-ce que le réseau neuronal convolutif?
[Ma note] Modèle utilisateur personnalisé de Django
Qu'est-ce qu'un chien? Volume de requêtes GET et paramètres de requête
Qu'est-ce qu'un chien? Django - Volume d'obtention du nom et de la date à partir de l'URL
C'est un Mac. Qu'est-ce que la commande Linux Linux?
Dites-moi ce qu'est une cartographie équiangulaire, Python!
Qu'est-ce que l'espace de noms
Qu'est-ce que copy.copy ()
Qu'est-ce que Django? .. ..
Qu'est-ce que dotenv?
Qu'est-ce que POSIX
Qu'est-ce qu'un chien? Django - Volume d'utilisation des valeurs obtenues à partir de l'URL dans une vue basée sur les classes
Qu'est-ce que Linux
Qu'est-ce que le klass?
Qu'est-ce que SALOME?
Qu'est-ce que Linux?
Qu'est-ce que python
Qu'est-ce que l'hyperopt?
Qu'est-ce que Linux
Qu'est-ce que pyvenv
Qu'est-ce que __call__
Qu'est-ce que Linux
Qu'est-ce que Python
Qu'est-ce qu'un moteur de recommandation? Résumé des types
Qu'est-ce que Dieu? Créez un chatbot simple avec python
Pour moi en tant que débutant Django (2) - Qu'est-ce que MTV?
Qu'est-ce qu'un chien? Django - Essayez d'utiliser Form pour la première fois Volume de transmission POST