如何只更改用户在UserChangeForm中输入的字段,而不是django中的所有字段?

时间:2019-05-20 09:29:07

标签: django django-forms

我创建自定义UserChangeForm并将所有字段设置为required = False,然后当用户以该形式更改一个字段时,数据库中的所有信息都会更改,如果用户留下一个字段,则将其更新为空。我只需要更改用户在表单中输入的字段,而其他字段在数据库中不会更改。

我尝试过:

    class UserInfoChangeForm(UserChangeForm):

        last_name = forms.CharField(label="",max_length=100,required=False)
        username = forms.CharField(label="", required=False)
        channel_name = forms.CharField(label="",max_length=100,required=False)

        class Meta:
            model = CustomUser
            fields = ('username', 'channel_name','last_name')

        def __init__(self, *args, **kwargs):
           '
            super(UserChangeForm, self).__init__(*args, **kwargs)
            self.fields.pop('password', 'email')

我的views.py:

def update(request):

    if request.method == 'POST':

        form = UserInfoChangeForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = UserInfoChangeForm()
    return render(request,'home/update.html',{'userupdate':UserInfoChangeForm})

2 个答案:

答案 0 :(得分:1)

您无需覆盖表单init,可以改写表单保存方法,以便仅更新所需的字段。

例如:

jql

答案 1 :(得分:1)

您可以将模型的实例传递给表单,以便它将使用现有值填充所有字段。这样,用户可以更改他们想要的任何字段。这样做的另一个好处是,它允许用户根据需要清除字段的值。

def update(request):
    if request.method == 'POST':

        form = UserInfoChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
    else:
        form = UserInfoChangeForm(instance=request.user)
    return render(request,'home/update.html', {'userupdate': UserInfoChangeForm})