Cette phrase m'a plus aidé que l'exemple de code.
Merci.

Le mercredi 18 mai 2016, 22:29:35 CEST Christophe Narbonne a écrit :
> Les ModelForm requièrent un paramètre `instance` pour des modifications
> d'une instance donnée… Voir ma précédente réponse…
> 
> 2016-05-18 15:14 GMT+02:00 Encolpe DEGOUTE <[email protected]>:
> 
> >
> > Après une bonne nuit de sommeil mon code fonctionne en l'état…
> > En revanche il me crée un nouvel User avant de passer dans la méthode save
> > ce qui me donne une erreur de duplicate :
> >
> > ERREUR:  la valeur d'une clé dupliquée rompt la contrainte unique « 
> > auth_user_username_key »
> > DETAIL:  La clé « (username)=(edegoute3) » existe déjà.
> >
> >
> > Si je rajoute pas la méthode form_valid dans la vue, le code ne passe
> > jamais dans le save.
> > À nouveau je ne suis pas très loin, mais je butte sur cette erreur.
> >
> >
> > class UserProfileChangeUsernameMailForm(forms.ModelForm, UserForm):
> >     class Meta:
> >         model = User
> >         fields = ['username', 'email']
> >
> >     def __init__(self, user=None, *args, **kwargs):
> >         self.user = user
> >         super(UserProfileChangeUsernameMailForm, self).__init__(*args,
> > **kwargs)
> >         self.fields['username'].initial = self.user.username
> >         self.fields['email'].initial = self.user.email
> >
> >     def save(self, *args, **kw):
> >         super(UserProfileChangeUsernameMailForm, self).save(*args, **kw)
> >         self.user.username = self.cleaned_data.get('username')
> >         self.user.email = self.cleaned_data.get('email')
> >         self.user.save()
> >
> >
> > class UserProfileChangeUsernameMailView(LoginRequiredMixin,
> > AjaxCapableProcessFormViewMixin, FormView):
> >     template_name = "personalshowper/userprofile/username_mail_change.html"
> >     form_class = UserProfileChangeUsernameMailForm
> >     success_url = reverse_lazy("userprofile_username_mail")
> >
> >     def get_form_class(self):
> >         return get_form_class(app_settings.FORMS,
> >                               'userprofile_username_mail',
> >                               self.form_class)
> >
> >     def get_form_kwargs(self):
> >         kwargs = super(UserProfileChangeUsernameMailView,
> > self).get_form_kwargs()
> >         kwargs["user"] = self.request.user
> >         return kwargs
> >
> >     def get_context_data(self, **kwargs):
> >         ret = super(UserProfileChangeUsernameMailView,
> > self).get_context_data(**kwargs)
> >         return ret
> >
> >     def form_valid(self, form):
> >         form.save()
> >         return super(UserProfileChangeUsernameMailView,
> > self).form_valid(form)
> >
> >
> >
> > ------------------------------
> > *De: *"Rémy Hubscher" <[email protected]>
> > *À: *[email protected]
> > *Envoyé: *Mercredi 18 Mai 2016 09:44:48
> > *Objet: *Re: [afpy/django] Problème de valeur initiale des champs pour un
> > ModelForm
> >
> >
> > Peut-être que ceci peut t'aider:
> > http://stackoverflow.com/questions/1727564/how-to-create-a-userprofile-form-in-django-with-first-name-last-name-modificati/1727685#1727685
> >
> > Le 18/05/2016 08:55, Christophe Narbonne a écrit :
> >
> > Tu veux peut-être associer ton ModelForm à ton modèle?
> >
> > class UserProfileChangeUsernameMailForm(forms.ModelForm):
> >    class Meta:
> >        model = User
> >        fields = ['username', 'email']
> >
> >    def __init__(self, *args, **kwargs):
> >        self.user = kwargs.pop('user', None)
> >        kwargs['instance'] = self.user
> >        super(forms.ModelForm, self).__init__(*args, **kwargs)
> > ……
> >
> > 2016-05-17 23:48 GMT+02:00 Encolpe DEGOUTE <[email protected]>:
> >
> >> Bonjour,
> >>
> >>
> >>
> >> J'essaie de remplir mes champs avec les valeurs de l'utilisateur
> >> authentifié..
> >>
> >> Lors du passage dans __init__ les champs sont remplis avec les valeurs
> >> attendues. En revanche à l'affichage les champs restent vides.
> >>
> >> Je tourne autour du pot depuis le début de l'après-midi et je ne vois
> >> plus comment faire.
> >>
> >>
> >>
> >> Le code form/view est le suivant. Le modèle User est le standard de
> >> Django avec une couche Allauth.
> >>
> >>
> >>
> >> from django.contrib.auth.models import User
> >>
> >> class UserProfileChangeUsernameMailForm(forms.ModelForm):
> >>    class Meta:
> >>        model = User
> >>        fields = ['username', 'email']
> >>
> >>    def __init__(self, *args, **kwargs):
> >>        self.user = kwargs.pop('user')
> >>        super(forms.ModelForm, self).__init__(*args, **kwargs)
> >>        self.fields['username'].initial = self.user.username
> >>        self.fields['email'].initial = self.user.email
> >>
> >>
> >> class UserProfileChangeUsernameMailView(LoginRequiredMixin,
> >> AjaxCapableProcessFormViewMixin, FormView):
> >>    template_name =
> >> "personalshowper/userprofile/username_mail_change.html"
> >>    form_class = UserProfileChangeUsernameMailForm
> >>    success_url = reverse_lazy("userprofile_change_username_mail")
> >>
> >>    def get_form_class(self):
> >>        return get_form_class(app_settings.FORMS,
> >>                              'change_username_mail',
> >>                              self.form_class)
> >>
> >>    def get_form_kwargs(self):
> >>        kwargs = super(UserProfileChangeUsernameMailView,
> >> self).get_form_kwargs()
> >>        kwargs["user"] = self.request.user
> >>        return kwargs
> >>
> >>    def get_context_data(self, **kwargs):
> >>        ret = super(UserProfileChangeUsernameMailView,
> >> self).get_context_data(**kwargs)
> >>        return ret
> >>
> >>
> >> class UserProfileChangeUsernameMailView(LoginRequiredMixin,
> >> AjaxCapableProcessFormViewMixin, FormView):
> >>    template_name =
> >> "personalshowper/userprofile/username_mail_change.html"
> >>    form_class = UserProfileChangeUsernameMailForm
> >>    success_url = reverse_lazy("userprofile_change_username_mail")
> >>
> >>    def get_form_kwargs(self):
> >>        kwargs = super(UserProfileChangeUsernameMailView,
> >> self).get_form_kwargs()
> >>        kwargs["user"] = self.request.user
> >>        return kwargs
> >>
> >>    def get_context_data(self, **kwargs):
> >>        ret = super(UserProfileChangeUsernameMailView,
> >> self).get_context_data(**kwargs)
> >>        return ret
> >>tres activités cérébrales
> >>


-- 
Encolpe Degoute
http://encolpe.wordpress.com
http://encolpe.degoute.free.fr
Logiciels libres, hockey sur glace et autres activités cérébrales

_______________________________________________
django mailing list
[email protected]
http://lists.afpy.org/mailman/listinfo/django

Répondre à