0
votes

I am facing one issue with django forms

Here is my model :

class User(models.Model):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


class UserProfile(AuditFields):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    designation = models.CharField(max_length=200, blank=True)
    contact_number = models.CharField(max_length=20, blank=True)
    team = models.CharField(max_length=200, blank=True)
    manager = models.CharField(max_length=200, blank=True)
    joining_date = models.DateField(default=datetime.now)

I need to create a form for editing profile details of the current user

This is my form. But it is a model Form so only getting the detauls from the User Profile table only

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        exclude = ['user']

How can I get first_name , last_name from User table and save it

1

1 Answers

2
votes

Just add the fields as a CharField in form, and use cleaned_data attribute to fetch the data and save it:

class UserProfileForm(forms.ModelForm):
    first_name = forms.CharField(max_length=30,required=True)
    last_name = forms.CharField(max_length=30,required=True)

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

    class Meta:
        model = UserProfile
        exclude = ['user']

    def save(self, commit=False):
        instance = super().save(commit=True)
        user = instance.user
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        return instance