Relation un à un: lier un modèle utilisateur à un modèle de profil personnalisé dans Django

La traduction de l'article a été préparée à la veille du début du cours "Développeur Web en Python" .






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: modelet fields. La variable modelcontiendra votre modèle utilisateur et la variable contiendra les fieldschamps 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: modelet fields. La variable modelcontient le modèle de profil et fieldsles 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.htmlcréez une balise de formulaire à l'aide de la méthode POST et actionavec une valeur de chaîne vide. Dans la balise form, csrf_tokennous 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.








All Articles