Как обновить две модели, используя одну django форму - PullRequest
0 голосов
/ 27 февраля 2020

У меня одна проблема с django формами

Вот моя модель:

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)

Мне нужно создать форму для редактирования сведений профиля текущего пользователя

Это моя форма. Но это модельная форма, поэтому только получение данных от таблицы профиля пользователя

class UserProfileForm(forms.ModelForm):

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

Как я могу получить имя и фамилию из таблицы пользователя и сохранить ее

1 Ответ

2 голосов
/ 27 февраля 2020

Просто добавьте поля в виде CharField и используйте атрибут cleaned_data для извлечения данных и сохранить его:

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
...