麻烦使用户更新视图

时间:2019-01-18 13:45:48

标签: django django-forms django-views

我有一个自定义用户模型,子类为AbstractBaseUser。 我目前在制作更新视图时遇到麻烦,因此用户可以更改其个人资料。通过管理界面更改用户可以正常工作。

这是我用来在管理和应用界面中更改用户对象的表格。

class UserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField(
        label=_("Password"),
        help_text=_(
            "Raw passwords are not stored, so there is no way to see this "
            "user's password, but you can change the password using "
            "<a href=\"{}\">this form</a>."
        ),
    )

    class Meta:
        model = User
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        password = self.fields.get('password')

        if password:
            password.help_text = password.help_text.format('../password/')
        user_permissions = self.fields.get('user_permissions')
        if user_permissions:
            user_permissions.queryset = user_permissions.queryset.select_related('content_type')

    def clean_password(self):
        return self.initial["password"]

我正在使用fields = '__all__'能够通过管理界面更改所有字段。但是在应用程序的界面中,我希望用户仅更改某些字段。 我认为:

def update_user(request):
    form = UserChangeForm(request.POST or None, instance=request.user, fields=('email', 'first_name'))

    if request.method == 'POST':
        if form.is_valid():
            form.save()
            return redirect('home')

        return render(request, 'update_user.html', {'form': form})

    return render(request, 'update_user.html', {'form': form})

如果我像这样传递fields这样的UserChangeForm(request.POST or None, request.user, fields=('email', 'first_name'))参数,则会出现__init__() got an unexpected keyword argument 'fields'错误。

如果我不通过它,我得到的所有文件的格式与管理员界面中的格式完全相同。

如何让此表单仅显示我想要的字段?

1 个答案:

答案 0 :(得分:1)

一种解决方案是创建UserChangeForm的子类,以便您可以在Meta类中选择所需的字段:

class MyUserChangeForm(UserChangeForm):

    class Meta(UserChangeForm.Meta):
        model = User
        fields = ['email', 'first_name]

然后在您的视图中使用您制作的新表格:

def update_user(request):
    form = MyUserChangeForm(request.POST or None, instance=request.user)
    # and so on ...