IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Placer la valeur d'un champ d'un formulaire dans un autre après redirection [Python 3.X]


Sujet :

Django Python

  1. #1
    Membre à l'essai Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Points : 13
    Points
    13
    Par défaut Placer la valeur d'un champ d'un formulaire dans un autre après redirection
    Bonjour/Bonsoir,

    Je débute doucement avec l'utilisation de Django et même si les fondamentaux semblent acquis, je suis souvent bloqué à des petits problèmes, comme celui-ci:

    J'utilise le model 'User' de Django pour la connexion et j'ai crée un second model 'Profil' dans lequel j'ajoute à chaque utilisateur les champs dont j'ai besoin qui ne sont pas dans le model 'User' de Django.

    Ainsi, à la création de compte, l'utilisateur doit entrer ses informations dans un premier formulaire pour le model 'User' puis est redirigé vers un formulaire lié à 'Profil' dans lequel un attribu user fait lien en OneToOne avec le model 'User'.

    J'aimerai que lors de cette redirection, le champ 'user' soit non éditable mais surtout qu'il ai déjà la valeur correspondante visible dans le formulaire sans que l'utilisateur ai à le rentrer.

    Voici où j'en suis :
    Views.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    @login_required
    def create(request):
        if request.method == 'POST':
            print('Création de l\'utilisateur en cours...')
     
            form = CreateUser(request.POST)
     
            if form.is_valid():
                form.save()
     
                return redirect('create/profil')
     
        else:
            form = CreateUser()
     
        return render(request, 'conge/create.html', {'form': form})
     
    @login_required
    def create_profil(request):
        if request.method == 'POST':
            print('Création du profil de l\'utilisateur en cours...')
     
            form = CreateProfil(request.POST)
     
            if form.is_valid():
     
                form.save()
     
                return redirect('/list')
     
        else:
            form = CreateProfil()
        return render(request, 'conge/createprofil.html', {'form': form})
    forms.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class CreateUser(forms.ModelForm):
        password = forms.CharField(widget=forms.PasswordInput)
        class Meta:
            model = User
            fields = ['username', 'password', 'first_name', 'last_name']
     
    class CreateProfil(forms.ModelForm):
        user = forms.CharField(disabled=True)
        class Meta:
            model = Profil
            fields = ['user' ,'code', 'service']

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Bonsoir, difficile de vous comprendre, mais je pense avoir une idée de ce que vous souhaitez, c'est à dire initialiser un champs lors de l'affichage d'un formulaire.

    Avez vous lu la documentation sur l'indication de valeurs initiales ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre à l'essai Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Merci fred1599 pour votre réponse !

    Il est bien question ici de placer une valeur initiale dans le champ d'un formulaire. L'administrateur à la création de compte doit passer par un form lié au model User de Django puis est redirigé vers un form lié au model profil. J'aimerai qu'à cet instant l'administrateur n'ai pas à choisir à nouveau l'utilisateur qu'il est en train de modifier et que je puisse "stocker" dans une variable la valeur du précédent formulaire pour initialiser le champ OneToOne du model Profil.

    Je voyais une seconde solution à cette manœuvre qui était de placer les deux ModelForm dans un seul <form>, solution sur laquelle je ne me suis pas encore penché -puisque je me bat avec du js en ce moment, pour le même projet-

    D'où l’existence du context contenant la variable 'usersave' dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @login_required
    def create(request):
        if request.method == 'POST':
            print('Création de l\'utilisateur en cours...')
     
            form = CreateUser(request.POST)
     
            if form.is_valid():
                print('Nom de compte : ', form.cleaned_data['username'])
                print('Mot de passe : ', form.cleaned_data['password'])
                usersave = form.cleaned_data['username']
                form.save()
                context = {
                    'usersave': usersave,
                }
     
                return redirect('create/profil',context)
     
        else:
            form = CreateUser()
     
        return render(request, 'conge/create.html', {'form': form})
    Variable usersave que j'ai essayé d'initialisé de cette façon -en vain-:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @login_required
    def create_profil(request):
        if request.method == 'POST':
            print('Création du profil de l\'utilisateur en cours...')
     
            form = CreateProfil(request.POST)
     
            if form.is_valid():
     
                form.save()
     
            return redirect('/list')
     
        else:
            form = CreateProfil(initial={'user':usersave})
        return render(request, 'conge/createprofil.html', {'form': form})
    J’espère avoir exposé le problème un peu plus clairement.

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    C'est pas simple quand on peut pas tester, mais le principe serait d'enregistrer dans une variable liée à la session actuelle, le nom du user

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @login_required
    def create(request):
        if request.method == 'POST':
            print('Création de l\'utilisateur en cours...')
     
            form = CreateUser(request.POST)
     
            if form.is_valid():
                print('Nom de compte : ', form.cleaned_data['username'])
                print('Mot de passe : ', form.cleaned_data['password'])
                usersave = form.cleaned_data['username']
                request.session['username'] = usersave  # enregistrement dans une variable de la session actuelle
                form.save()
                context = {
                    'usersave': usersave,
                }
     
                return redirect('create/profil',context)
     
        else:
            form = CreateUser()
      return render(request, 'conge/create.html', {'form': form})
    et de récupérer cette variable dans votre formulaire en utilisant le paramètre initial comme je l'ai indiqué dans mon lien un peu plus haut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @login_required
    def create_profil(request):
        if request.method == 'POST':
            print('Création du profil de l\'utilisateur en cours...')
     
            form = CreateProfil(request.POST, initial=request.session['username']) 
            if form.is_valid():
     
                form.save()
     
            return redirect('/list')
     
        else:
            form = CreateProfil() return render(request, 'conge/createprofil.html', {'form': form})
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre à l'essai Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Désolé de répondre si tardivement !

    Sur le principe, ta solution marche parfaitement, mais je suis confronté à un nouveau problème :

    Pour lier le model Profil et le model User, j'utilise un OneToOneField

    Là où je pensais avoir besoin de l'username pour avoir un champ valide, il me demande un IntegerField. J'ai donc un peu bidouillé dans le shell pour essayer d'obtenir cet IntegerField qui correspond à la PK de User mais je me retrouve à récolter "None" lorsque je cherche le champ "id" ou "pk" dans le shell, ce qui ne m'aide pas des masses. Pourtant avec une commande du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    user = User.objects.create_user('nomdutilisateur', 'mail@nomdedomaine.truc', 'P@ssw0rd')
    user.id
    j'obtiens bien la PK de l'user que je viens de créer en résultat !

    L'objectif est donc d'obtenir la PK d'un user à partir du premier formulaire suite à un save()

    Actuellement, voici tout ce que j'ai bidouillé :

    models.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from django.db import models
    from django.contrib.auth.models import User
     
     
    class Profil(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        code = models.CharField(max_length=4, help_text='Code salarié (4 chiffres)')
        service = models.CharField(max_length=255, help_text='Service de l\'employé')
        solde = models.DecimalField(max_digits=4, decimal_places=1)
        acquis = models.DecimalField(max_digits=4, decimal_places=1)
     
        def __str__(self):
            return 'Profil de {}'.format(self.user)
    forms.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class CreateUser(forms.ModelForm):
        password = forms.CharField(widget=forms.PasswordInput)
        class Meta:
            model = User
            fields = ['username', 'password', 'first_name', 'last_name']
     
     
    class CreateProfil(forms.ModelForm):
        user = forms.CharField(disabled=True)
        class Meta:
            model = Profil
            fields = ['user','code', 'service', 'solde', 'acquis']
    views.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    @login_required
    def create(request):
        if request.method == 'POST':
            print('Création de l\'utilisateur en cours...')
     
            form = CreateUser(request.POST)
     
            if form.is_valid():
                print('Nom de compte : ', form.cleaned_data['username'])
                print('Mot de passe : ', form.cleaned_data['password'])
                usersave = form.cleaned_data['username']
                request.session['username'] = usersave  # enregistrement dans une variable de la session actuelle
                form.save()
                context = {
                    'usersave': usersave,
                }
     
                return redirect('create/profil', context)
        else:
            form = CreateUser()
        return render(request, 'conge/create.html', {'form': form})
     
     
    @login_required
    def create_profil(request):
        usersave = request.session['username']
        if request.method == 'POST':
            print('Entré dans la boucle "POST""')
            print('Création du profil de l\'utilisateur en cours...')
            print('Valeur de user dans la variable de session : ' + request.session['username'])
     
            form = CreateProfil(request.POST, initial={'user': usersave})
            if form.is_valid():
                print('Entré dans la boucle "formulaire valide"')
                form.save()
                return redirect('/conge/user/list')
            else:
                print('Entré dans la boucle "formulaire pas valide"')
                return render(request, 'conge/createprofil.html', {'form': form})
        else:
            print('Entré dans la boucle "else"')
            form = CreateProfil(initial={'user': usersave})
            return render(request, 'conge/createprofil.html', {'form': form})
    Je ne suis pas encore totalement familiarisé avec le modèle de connexion que propose Django, récupérer un champ dans mes models semble pourtant si simple, alors récupérer la PK d'un utilisateur ne doit pas être bien sorcier non plus...!

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Bonsoir,

    Là où je pensais avoir besoin de l'username pour avoir un champ valide, il me demande un IntegerField
    Ce n'est pas clair, où et à quelle ligne exactement, cherche-t-on à avoir un IntegerField ?

    Si c'est dans la création de Profil, je ne vois pas pourquoi ? J'ai besoin d'éclaircissement...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre à l'essai Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Pour le champ suivant de mon Modelform de Profil, j'ai besoin d'un Integer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    Et en effet, lorsque je regarde le code source de la page au moment où ce champ est en select HTML, j'obtiens :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <select name="user" required id="id_user">
    <option value="" selected>---------</option>
    <option value="1">NomUser1</option>
    <option value="2">NomUser2</option>
    </select>

    Ce champ renvoi donc un integer correspondant à la PK de la table User fournie par Django et non pas le username comme laisse entendre l'aspect visuel du select puisqu'il nous afficher l'username

    Avec les précédentes réponses, j'ai réussi à faire ce que je souhaitais faire à la base, obtenir la valeur de l'username créer lors du premier form puis la placer dans ce champ OneToOne en non modifiable. Cependant, puisqu'il attend un int et non pas un username il m'affichait une erreur au niveau du formulaire "must be an integer" ce qui est totalement logique.

    La question est désormais de savoir comment obtenir cette PK de la table user au moment de sa mise en DB via le form.

    Je te remercie en tout cas pour le temps que tu m'accordes, je continue de faire des petits bidouillages de mon côté au cas où je trouverai la solution.

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    J'utilise très peu OneToOneField mais il est conseillé d'y ajouter le paramètre primary_key=TrueConcernant l'user, il faut déjà le requêter dans ta base pour avoir son pk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    user = User.objects.get(username=request.session['username'])
    pk = user.pk
    Si ça ne fonctionne pas, c'est que l'enregistrement dans ta base ne s'est pas fait.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Membre à l'essai Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Bien, tout est désormais réglé grace à ton aide, Fred1599 !

    Voici donc le résultat final avec mes 15.000 print() de débutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    @login_required
    def create(request):
        if request.method == 'POST':
            print('Création de l\'utilisateur en cours...')
     
            form = CreateUser(request.POST)
     
            if form.is_valid():
                print('Nom de compte : ', form.cleaned_data['username'])
                print('Mot de passe : ', form.cleaned_data['password'])
                usersave = form.cleaned_data['username']
                print('usersave : ',usersave)
                request.session['username'] = usersave  # enregistrement dans une variable de la session actuelle
                print('request.session[\'username\'] : ',request.session['username'])
                form.save()
                user = User.objects.get(username=request.session['username'])
                print('user : ', user)
                pk = user.pk
                print('pk : ', pk)
                request.session['username'] = pk
                print('request.session[\'username\'] : ',request.session['username'])
                context = {
                    'usersave': usersave,
                }
     
                return redirect('create/profil', context)
        else:
            form = CreateUser()
        return render(request, 'conge/create.html', {'form': form})
     
     
    @login_required
    def create_profil(request):
        usersave = request.session['username']
        if request.method == 'POST':
            print('Entré dans la boucle "POST""')
            print('Création du profil de l\'utilisateur en cours...')
            print('Valeur de user dans la variable de session : ', request.session['username'])
     
            form = CreateProfil(request.POST, initial={'user': usersave})
            if form.is_valid():
                print('Entré dans la boucle "formulaire valide"')
                form.save()
                return redirect('/conge/user/list')
            else:
                print('Entré dans la boucle "formulaire pas valide"')
                return render(request, 'conge/createprofil.html', {'form': form})
        else:
            print('Entré dans la boucle "else"')
            form = CreateProfil(initial={'user': usersave})
            return render(request, 'conge/createprofil.html', {'form': form})
    Merci encore pour le temps que tu m'as consacré !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2017, 15h58
  2. Réponses: 13
    Dernier message: 04/09/2017, 20h42
  3. Réponses: 3
    Dernier message: 13/01/2009, 16h55
  4. Réponses: 9
    Dernier message: 05/08/2008, 09h12
  5. Réponses: 7
    Dernier message: 27/11/2007, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo