Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a UserProfile form in Django with first_name, last_name modifications?

If think my question is pretty obvious and almost every developer working with UserProfile should be able to answer it.

However, I could not find any help on the django documentation or in the Django Book.

When you want to do a UserProfile form in with Django Forms, you'd like to modify the profile fields as well as some User field.

But there is no forms.UserProfileForm (yet?)!

How do you do that?

like image 482
Natim Avatar asked Sep 11 '25 05:09

Natim


2 Answers

I stumbled across this today and after some googling I found a solution that is a bit cleaner in my opinion:

#in forms.py
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ["username", "email"]

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile

#in views.py
def add_user(request):
    ...
    if request.method == "POST":
        uform = UserForm(data = request.POST)
        pform = UserProfileForm(data = request.POST)
        if uform.is_valid() and pform.is_valid():
            user = uform.save()
            profile = pform.save(commit = False)
            profile.user = user
            profile.save()
            ....
    ...

#in template
<form method="post">
    {{ uform.as_p }}
    {{ pform.as_p }}
    <input type="submit" ...>
</form>

Source

like image 85
theycallmemorty Avatar answered Sep 12 '25 20:09

theycallmemorty


Here is how I finally did :

class UserProfileForm(forms.ModelForm):
    first_name = forms.CharField(label=_(u'Prénom'), max_length=30)
    last_name = forms.CharField(label=_(u'Nom'), max_length=30)

    def __init__(self, *args, **kw):
        super(UserProfileForm, self).__init__(*args, **kw)
        self.fields['first_name'].initial = self.instance.user.first_name
        self.fields['last_name'].initial = self.instance.user.last_name

        self.fields.keyOrder = [
            'first_name',
            'last_name',
            ...some_other...
            ]

    def save(self, *args, **kw):
        super(UserProfileForm, self).save(*args, **kw)
        self.instance.user.first_name = self.cleaned_data.get('first_name')
        self.instance.user.last_name = self.cleaned_data.get('last_name')
        self.instance.user.save()

    class Meta:
        model = UserProfile
like image 26
Natim Avatar answered Sep 12 '25 19:09

Natim