首页 > 解决方案 > 如何使用一个 django 表单更新两个模型

问题描述

我正面临 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']

如何从 User 表中获取 first_name , last_name 并保存

标签: djangodjango-modelsdjango-forms

解决方案


只需将字段添加为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

推荐阅读