如何仅更新Django模型中的特定字段?

问题描述 投票:0回答:1

我只想更新模型中的特定字段。这是我的模型。py

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='teacher/images')
    phone = models.CharField(max_length=15)
    address = models.CharField(max_length=25)
    salary = models.DecimalField(max_digits=20, decimal_places=2)
    joindate = models.DateField(auto_now_add=True)
    status = models.BooleanField(default=True)

这是我的表格。py

class TeacherForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password']


class TeacherExtraForm(forms.ModelForm):
    class Meta:
        model = models.Teacher
        fields = ['phone', 'address', 'salary', 'status', 'image']

这是我的views.py

def update_teacher(request, pk):
    teacher = models.Teacher.objects.get(id=pk)
    user = models.User.objects.get(id=teacher.user_id)
    form1 = forms.TeacherForm(instance=user)
    form2 = forms.TeacherExtraForm(instance=teacher)
    context = {
        'teacher': teacher,
        'user': user,
        'form1': form1,
        'form2': form2
    }
    if request.method == 'POST':
        form1 = forms.TeacherForm(request.POST, instance=user)
        form2 = forms.TeacherExtraForm(request.POST, instance=teacher)
        if form1.is_valid() and form2.is_valid():
            user = form1.save(commit=False)
       
            user.save(update_fields=['first_name', 'last_name', 'email', 'username'])
            f2 = form2.save(commit=False)
            f2.status = True
            f2.save(update_fields=['phone', 'address', 'salary', 'status'])
            return redirect('Teacher:teacher_index')
    return render(request, 'Teacher/update_teacher.html', context)

在这里,我只想更新名字,姓氏,电子邮件,用户名,电话,地址,薪水和状态,而不会影响密码和图像字段。当我也添加密码和图像字段时,它可以工作,但是我不想在这里更新密码和图像。

django
1个回答
0
投票

您必须使用commit = False键保存表单

temp_form = form1.save(commit=False)

temp_form.user = "New one"

使用此解决方案,其他所有键都保存但不写入模型,您可以更改其中任何一个。最后保存表单,不用commit = False


0
投票

通常在这种情况下,一种形成two形式,一种形成为create,一种形成为update。例如,Django本身具有UserCreateForm [Django-doc]UserCreateForm。因此,我们可以构造另外两种形式:

UserChangeForm [Django-doc]

在视图中,我们然后使用以下形式:

UserChangeForm
© www.soinside.com 2019 - 2024. All rights reserved.