Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Django] et les UserProfile

    16 février 2013 à 18:04:20

    Bonjour à toutes et tous,

    Je travaille actuellement sur un projet Django que je découvre au fil de l'eau et je rencontre un petit soucis, qui me fait taper la tete contre le mur et ce malgré la doc du site du zéro et l'officielle. 

    Pourtant mon soucis est simple. J'ai un model, UserProfile qui est en relation one to one avec le User de l'API django. Je cherche a afficher un formulaire de saisi avec les champs (username, password, last_name, first_name) de la classe User et ('tel') de la classe UserProfil.

    j'ai les code suivant :

    models.py

    from django.db import models
    from django.contrib.auth.models import User
    
    class Personn(models.Model):
        user = models.OneToOneField(User)
        tel = models.IntegerField(max_length=10)

    form.py

    from django import forms
    from adrs.models import Personn
    from django.db.models.base import Model
    from django.forms import models
    from django.contrib.auth.models import User
    from django.conf.urls import include
    
    
    
    class PersonnForm (forms.ModelForm):
            class Meta:
                model = Personn
                fields = ('User.username', 'User.password', 'tel')

    views.py (qui n'est pas fini, je cherche dejà à afficher le formulaire

    def personn_create(request):
        if request.method =="POST":
            form = PersonnForm(request.POST)
             
        else : 
            form = PersonnForm()
        return render_to_response('adrs/personn_create.html', { 'form' : form})



    Je sais que le soucis viens du form.py mais je n'arrive pas a trouver sur le net un code qui me permette d'afficher en un seul formulaire les champs du User et ceux du UserProfile.

    Can you help me please ? :(

    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2013 à 14:10:33

      from django import forms
      from django.contrib.auth.models import User
      from blog.models import Membre
      
      class UserForm(forms.ModelForm):
      
          class Meta:
              model = User
              fields = ['first_name', 'last_name', 'email']
      
      class UserProfileForm(forms.ModelForm):
          class Meta:
              model = Membre
              fields = ['telfixe','telport','ville','cdp','rue']


      Dans la view il te faudra 2 form.

      uForm = UserForm()

      pForm = UserProfilForm()

      et tu les envois vers ton template

      return render(request, 'letemplate.html', {'uform':uform,'pform':pform}

      En fait ici membre correspond à personn chez toi. C'est le code d'un projet que je finalise actuellement ^^

      -
      Edité par PuckMan 18 février 2013 à 14:11:41

      • Partager sur Facebook
      • Partager sur Twitter
        18 février 2013 à 15:01:04

        PuckMan a écrit:


        Dans la view il te faudra 2 form.

        Pas très propre tout ça :p

        Tu peux utiliser les modelformset_factory ou inlineformset_factory. Tu peux lire ceci pour en savoir plus : https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets

        • Partager sur Facebook
        • Partager sur Twitter
        Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
          19 février 2013 à 10:46:20

          Ah ! J'étais pas au courant des modelformset je vais voir ca de suite!
          • Partager sur Facebook
          • Partager sur Twitter
            19 février 2013 à 21:30:51

            Merci pour vos indications, je vais essayer de creuser dans ce sens :)
            • Partager sur Facebook
            • Partager sur Twitter
              23 février 2013 à 17:40:13

              Je reviens vers vous, car je n'arrive pas à utiliser les modelformset comme indiqué.

              En fait j'arrive à enregistrer un UserProfile associé à un User en utilisant un UserProfileForm (formulaire basique crée à la main). Mais je cherche à faire un formulaire dérivé de ModelForm et je n'y arrive pas... Quand aux modelformset_factory ou inlineformset_factory, je n'arrive pas a les utiliser. Je n'ai pas bien pigé comment ca marche.

              Visiblement le premier permet de multiplié par la valeur "extra" le nombre de formaulaire et le second permet de fusionner deux model lié par une ForeignKey, mais ca ne marche pas avec la class User de Django...

              J'arrive pas a trouver une méthode simple, clair et mécanique, qui me permette de creer un UserProfile avec une relation OneToOne avec User. Je ne fais que du bricolage branlant qui ne me plaise pas. 

              • Partager sur Facebook
              • Partager sur Twitter
                23 février 2013 à 17:44:19

                Voici ce que j'arrive à faire pour le moment en faisant le fameux Form à la main :

                form.py
                
                class ProfilForm (forms.Form):
                    username = forms.CharField(max_length=30)
                    password = forms.CharField(max_length=30)
                    first_name = forms.CharField(max_length=30)
                    last_name = forms.CharField(max_length=30)
                    tel = forms.IntegerField()
                
                view.py
                
                def profil_create(request):
                    if request.method =="POST":
                        form = ProfilForm(request.POST)
                        if form.is_valid():
                            user = User.objects.create_user(username = form.cleaned_data['username'], 
                                                            email ='', 
                                                            password = form.cleaned_data['password'])
                            user.first_name = form.cleaned_data['first_name']
                            user.last_name = form.cleaned_data['last_name']
                            user.is_staff = False
                            user.save()
                            profil = Profil(user = user, tel = int(form.cleaned_data['tel']))
                            profil.save()
                            return redirect('adrs.views.profil_list')
                    else : 
                        form = ProfilForm()
                    return render_to_response('adrs/profil_create.html', { 'form' : form})



                • Partager sur Facebook
                • Partager sur Twitter

                [Django] et les UserProfile

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown