Pfft ... Encore des bases de données?
Il existe trois relations principales dans une base de données relationnelle:
- Relation individuelle;
- Relation un-à-plusieurs;
- Relation plusieurs-à-plusieurs.
Dans cet article, nous traiterons du premier d'entre eux, la relation un à un.
Habituellement, Django a déjà un modèle utilisateur fourni avec le framework. Il est livré avec ses propres champs, méthodes, attributs, etc. L'inconvénient de ce modèle utilisateur est qu'il ne vous permet pas d'ajouter des champs personnalisés en dehors des valeurs par défaut déjà fournies dans Django. Cela peut être un problème sérieux car un développeur peut avoir besoin de configurer complètement un profil utilisateur / client à partir d'un groupe d'utilisateurs authentifiés. Par exemple, un site de blog peut avoir besoin d'un profil d'auteur, qui comprendrait la photo d'un utilisateur, son adresse de contact, son passe-temps, sa niche, etc. Et le modèle utilisateur fourni avec Django ne le permet pas.
Pour résoudre ce problème, les développeurs créent un modèle de profil personnalisé et le connectent au modèle utilisateur par défaut dans Django en utilisant une relation un-à-un. Il se trouve que l'utilisateur est garanti d'être connecté à un profil et vice versa. De plus, cette mécanique permet un meilleur contrôle sur la personnalisation du modèle de profil.
Maintenant, je vais vous montrer comment vous pouvez faire cela dans Django.
1. Utilisez le modèle utilisateur Django par défaut
Dans l'application dans laquelle vous souhaitez créer un profil, créez un nouveau fichier forms.py . Dans forms.py, importez les modules suivants:
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
Créez une classe à partir de laquelle hériter
UserCreationForm
. À l'intérieur de cette classe, créez une autre méta-classe qui aura deux variables: model
et fields
. La variable model
contiendra votre modèle utilisateur et la variable contiendra les fields
champs de formulaire qui seront créés.
class createUserForm(UserCreationForm):
class meta:
model = User
fields = ['username', 'password1', 'password2']
Le code ci-dessus créera un formulaire avec des champs pour le nom d'utilisateur, le mot de passe et la confirmation du mot de passe.
2. Créez votre modèle de profil utilisateur personnalisé.
Dans votre fichier models.py, importez le modèle utilisateur par défaut.
from django.contrib.auth.models import User
L'étape suivante consiste à créer votre propre modèle de profil, ainsi qu'à créer un champ utilisateur avec une relation un-à-un avec le modèle utilisateur par défaut dans Django.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True,)
name = models.CharField(max_length=200, null=True)
email = models.CharField(max_length=200, null=True)
address = models.CharField(max_length=200, null=True)
def __str__(self):
return self.name
3. Créez une forme pour votre modèle de profil.
Ouvrez le fichier form.py et importez votre modèle de profil à partir de models.py , ajoutez également quelques autres importations qui vous seront utiles lors de la création de votre formulaire de profil.
from django import forms
from django.utils.translation import ugettext_lazy as _
from .models import Profile
Créez ensuite une classe qui héritera de
forms.ModelForm
. Dans cette classe, créez une autre classe méta contenant deux variables: model
et fields
. La variable model
contient le modèle de profil et fields
les champs de formulaire qui seront créés.
class profileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['name', 'email', 'address']
#The labels attribute is optional. It is used to define the labels of the form fields created
labels = {
"name": _("Name "),
"email": _("Email Address"),
"address": _("Street Address"),
}
Maintenant que les formulaires sont prêts, nous allons définir la logique dans views.py avant de la rendre dans nos modèles.
4. Ajoutez la logique à views.py .
Pour travailler avec des formulaires créés dans forms.py, vous devez les importer dans notre views.py et ajouter quelques modules supplémentaires qui seront utiles pour créer la logique.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login,
from django.contrib import messages
from .models import Profile
from .forms import createUserForm, profileForm
Créons maintenant une page d'inscription. Appelons-le simplement registerPage . Créons un dictionnaire de contexte vide et retournons le rendu.
def registerPage(request):
context = {}
return render(request, 'app_name/register.html', context)
Affectons des valeurs du formulaire aux variables en appelant la méthode POST. Ensuite, nous passerons les variables au dictionnaire de contexte.
def registerPage(request):
if request.method == 'POST':
form = createUserForm(request.POST)
profile_form = profileForm(request.POST)
context = {'form': form, 'profile_form': profile_form}
return render(request, 'app_name/register.html', context)
Ensuite, nous validerons les deux formulaires et les enregistrerons par la suite.
def registerPage(request):
if request.method == 'POST':
form = createUserForm(request.POST)
profile_form = profileForm(request.POST)
if form.is_valid() and profile_form.is_valid():
user = form.save()
#we don't save the profile_form here because we have to first get the value of profile_form, assign the user to the OneToOneField created in models before we now save the profile_form.
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
context = {'form': form, 'profile_form': profile_form}
return render(request, 'app_name/register.html', context)
Si les valeurs du formulaire sont validées et enregistrées, nous afficherons un message de réussite et redirigerons l'utilisateur vers la page de connexion.
def registerPage(request):
if request.method == 'POST':
form = createUserForm(request.POST)
profile_form = profileForm(request.POST)
if form.is_valid() and profile_form.is_valid():
user = form.save()
#we don't save the profile_form here because we have to first get the value of profile_form, assign the user to the OneToOneField created in models before we now save the profile_form.
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
messages.success(request, 'Your account has been successfully created')
return redirect('login')
context = {'form': form, 'profile_form': profile_form}
return render(request, 'app_name/register.html', context)
5. Rendu du modèle
Dans le fichier,
register.html
créez une balise de formulaire à l'aide de la méthode POST et action
avec une valeur de chaîne vide. Dans la balise form, csrf_token
nous placerons le format de modèle django, puis nous rendrons dynamiquement les formulaires (formulaires utilisateur et profil). N'oublions pas non plus le bouton d'envoi.
<form method="POST" action="">
{% csrf_token %}
<h3>Register Profile</h3>
<div class="form-field">
{{profile_form.name.label_tag}}
{{profile_form.name}}
</div>
<div class="form-field">
{{form.username.errors}}
{{form.username.label_tag}}
{{form.username}}
</div>
<div class="form-field">
{{profile_form.email.label_tag}}
{{profile_form.email}}
</div>
<div class="form-field">
{{profile_form.address.label_tag}}
{{profile_form.address}}
</div>
<div class="form-field">
{{form.password1.errors}}
{{form.password1.label_tag}}
{{form.password1}}
</div>
<div class="form-field">
{{form.password2.errors}}
{{form.password2.label_tag}}
{{form.password2}}
</div>
<hr>
<input id="form-button" class="btn btn-success btn-block" type="submit" value="Create Profile">
<br>
{{form.non_field_errors}}
<p>Already have an account? <a href="{% url 'login' %}">Login</a></p>
</form>
Puisqu'après avoir rempli le formulaire, vérifié et sauvegardé, nous redirigeons vers la page de connexion, un message sur la réussite de l'opération sera affiché sur la page de connexion en bas à droite avant l'inscription «Vous n'avez pas de compte? S'inscrire " .
<form method="POST" action="">
...
<hr>
<input id="form-button" class="btn btn-success btn-block" type="submit" value="Login">
{% for message in messages %}
<p>{{message}}</p>
{% endfor %}
<p>Don't have an account? <a href="{% url 'store:register' %}">Register</a></p>
</form>
C'est ainsi que vous créez un modèle de profil pour votre site qui est lié à votre modèle d'utilisateur dans une relation un-à-un.