Utilisateurs personnalisés et enregistrement avec validation par email en utilisant Django et django-registration
En utilisant Django j’ai eu à mettre en place des utilisateurs personnalisés et un système d’authentification nécessitant la validation par courriel. Ce petit tutoriel vous expliquera comment faire cela avec Django 1.10 et le module django-registration.
Configuration de l’email
Dans un premier temps il faut configurer le courriel pour Django. La configuration présentée est valide uniquement pour un environnement de développement. En production il faudra utiliser le backend smtp. Pour tester le courriel en cours de développement ajouter ceci dans le fichier settings.py de votre projet :
# Email
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/djangomail/'
EMAIL_SUBJECT_PREFIX = "[DjangoTest] "
EMAIL_TIMEOUT = 3
EMAIL_HOST_USER = "fakeuser@fakeemail.com"
Création d’un modèle utilisateur personnalisé
D’abord, il faut créer une application (nommé “customuser” ici), cette création peut s’effectuer via la commande “python manage.py startapp customuser”. Ensuite, il est nécessaire de créer le modèle de l’utilisateur dans le fichier models.py.
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _
class User(AbstractUser):
"""
On fait hériter notre classe User de AbstractUser pour avoir les groupes, les permissions, le nom, l'email, etc.
Si vous n'avez pas besoin de ces fonctionnalités vous pouvez hériter de BaseAbstractUser
"""
# modification du champ username
username = models.CharField(max_length=255, unique=True, verbose_name=_("Username"))
# modification du champ email
email = models.EmailField(unique=True, verbose_name=_("Email Address"))
# ajout du champ animal préféré à l'utilisateur
favorite_animal = models.CharField(max_length=255, verbose_name=_("Favorite Animal"))
Configurer Django pour utiliser notre modèle utilisateur
Pour cela il faut encore modifier le fichier settings.py du projet.
# définit le modèle utilisateur à utiliser pour le système d'authentification
AUTH_USER_MODEL = 'customuser.User'
# Ajout de notre application contenant notre modèle utilisateur aux applications
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'customuser',
]
Ajout de templates
Pour la suite, afin de pouvoir tester notre site web nous allons avoir besoin de templates. Il existe des templates fonctionnelles, mais pas très jolies, à télécharger. Extrayez l’archive dans un dossier “templates” que vous avez créée à la racine de votre projet. Vous pourrez les personnaliser après le tutoriel.
Ajout des URLs pour le module django-registration
Dans le fichier urls.py du projet il faut rajouter des URLs pour rendre le projet fonctionnel.
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# ajout des urls que nous créerons dans l'application customuser
url(r'^accounts/', include('customuser.urls')),
# ajout des urls de django-registration (celles utilisant les templates installées)
url(r'^accounts/', include('registration.backends.hmac.urls')),
]
Création du formulaire d’inscription personnalisé
La configuration des URLs faite précédemment nous permet de remplacer les divers formulaires par défaut de django-registration. Par exemple, nous pouvons créer notre propre formulaire d’enregistrement dans le fichier forms.py de notre application.
from registration.forms import RegistrationForm
from customuser.models import User
class CustomUserForm(RegistrationForm):
"""
Formulaire d'enregistrement personnalisé.
"""
class Meta:
# utilisation de notre modèle
model = User
# ajout des champs username, favorite_animal et email.
# Le champ password est ajouté automatiquement par la classe parente
fields = ["username", "favorite_animal", "email"]
Pour que le formulaire soit fonctionnel il faut modifier le fichier urls.py de notre application.
from django.conf.urls import url
from registration.backends.hmac.views import RegistrationView
from customuser.forms import CustomUserForm
urlpatterns = [
# la vue d'enregistrement de l'utilisateur doit utiliser notre formulaire personnalisé
url(r'^register/$', RegistrationView.as_view(form_class=CustomUserForm), name='registration_register'),
]
Rendre l’interface d’administration plus jolie (optionnel)
Si vous souhaitez voir plus clairement vos utilisateurs via l’interface administration vous pouvez modifier le fichier admin.py de votre application.
from django.contrib import admin
from customuser.models import User
class UserAdmin(admin.ModelAdmin):
"""
choix des champs et de leurs divers fonctions
"""
list_display = ['username', 'email']
list_filter = ['username', 'email']
ordering = ['username', 'email']
search_fields = ['username', 'email']
# application de nos choix pour le modèle utilisateur
admin.site.register(User, UserAdmin)
Utilisateurs personnalisés et enregistrement avec validation par email en utilisant Django et django-registration par La Réponse est 42 est sous Licence Creative Commons Internationale Attribution-Partage à l'identique 4.0.
j’ai un problème au niveau du templates est ce que vous pourriez m’aider la dessus svp?
le type d’erreur c’est :
TemplateDoesNotExist at /accounts/register/
registration/registration_form.html
Request Method:
GET
Request URL:
http://localhost:8000/accounts/register/
Django Version:
1.10.4
Exception Type:
TemplateDoesNotExist
Exception Value:
registration/registration_form.html
Exception Location:
/home/name/Documents/work/.virtualenvs/test1/lib/python3.5/site-packages/django/template/loader.py in select_template, line 53
Python Executable:
/home/name/Documents/work/.virtualenvs/test1/bin/python
Python Version:
3.5.2
Python Path:
[‘/home/name/python_web_project/user_customize_registration’,
‘/home/name/Documents/work/.virtualenvs/test1/lib/python35.zip’,
‘/home/name/Documents/work/.virtualenvs/test1/lib/python3.5’,
‘/home/name/Documents/work/.virtualenvs/test1/lib/python3.5/plat-linux’,
‘/home/name/Documents/work/.virtualenvs/test1/lib/python3.5/lib-dynload’,
‘/usr/local/lib/python3.5’,
‘/usr/local/lib/python3.5/plat-linux’,
‘/home/name/Documents/work/.virtualenvs/test1/lib/python3.5/site-packages’,
‘/home/name/Documents/work/.virtualenvs/test1/lib/python3.5/site-packages/django_registration-2.2-py3.5.egg’]
Server time:
Mon, 2 Jan 2017 04:14:43 +0000
Django ne trouve pas les templates que vous avez installées. Vous devriez vérifier si les templates sont bien dans dans le dossier templates/registration/. Si vous avez toujours le problème alors Django cherche les templates dans un autre dossier “TemplateDoesNotExist at /accounts/register/registration/registration_form.html”. Tentez d’extraire l’archive dans le dossier templates/accounts/register/. Si vous avez un lien vers le code je pourrais peut-être vous en dire plus.
Bonjour ! Le tuto est vraiment bon c’est le gros soucis que j’avais depuis un certain temps,
Mais moi mon projet je l’ai déjà commencé en utilisant seulement le Model User de django.
Maintenant est-il possible de faire l’authentification par email à travers l’email entré par l’utilisateur voulant s’inscrire ?
Utiliser ses propres template pour éviter d’extraire des templates téléchargés.
Voici mon code d’inscription :
class InscriptionForm(forms.Form):
nom_utilisateur =forms.CharField(max_length=50)
email = forms.EmailField(label=”Votre adresse email”)
mot_de_passe = forms.CharField(label=”Votre mot de passe”, widget=forms.PasswordInput)
confirmation_mot_de_passe = forms.CharField(label=”Confirmation du mot de passe”, widget=forms.PasswordInput)
Quand je récupère les données de la part de l’utilisateur voulant s’inscrire j’utilise la méthode User.objects.create_user en lui passant en paramètre les données reçues, simplement parce que j’ai pas d’autres options.
Si c’est possible dans mon cas là de faire une authentification par email.
Voici le fichier views:
def pour_inscription(request):
confirmation=False
personne = InscriptionForm(request.POST)
if personne.is_valid():
nom_utilisateur = personne.cleaned_data[“nom_utilisateur”]
email= personne.cleaned_data[“email”]
mot_de_passe = personne.cleaned_data[“mot_de_passe”]
confirmation_mot_de_passe = personne.cleaned_data[“confirmation_mot_de_passe”]
if mot_de_passe == confirmation_mot_de_passe:
utilisateur = User.objects.create_user(nom_utilisateur, email,mot_de_passe)
return redirect(exper)
else:
confirmation = True
return render(request, “inscription/index.html”, locals())
Si possible de passer par la validation d’inscription par email ? Au secours !
Le tutoriel est écrit pour le cas ou vous souhaitez un modèle d’utilisateur personnalisé. Vous pouvez bien entendu utiliser le modèle utilisateur par défaut en sautant et modifiant quelques étapes du tutoriel 😉
Les templates à télécharger sont vraiment des templates très basique qui permettent de comprendre facilement quelles templates doivent être créer pour django-registration. Vous pouvez allez lire la documentation de django-registration si vous souhaitez créer vos templates sans pour autant télécharger celles que je propose. Cependant, je vous conseil de les télécharger au moins en complément de la documentation.
Vos problèmes et commentaires m’indique que vous n’utilisez pas django-registration (corrigez moi si je me trompe). Le module django-registration vise à faciliter l’enregistrement et le login des utilisateurs en offrant une couche d’abstraction supplémentaire. Bien sur vous n’êtes pas obliger de l’utiliser, mais l’objet de l’article est l’utilisation de ce module.
Pour vos problèmes je vous invite à lire la documentation de Django si vous ne souhaitez pas utiliser django-registration.
C’est possible de voir sur le fichier views comment envoyer l’email à l’utilisateur ?
Pour envoyer un courriel il faut utiliser la fonction send_mail. Sinon le code de django registration est libre, vous pouvez le lire pour trouver ce dont vous avez besoin 😉