我有一个自定义用户模型,子类为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'
错误。
如果我不通过它,我得到的所有文件的格式与管理员界面中的格式完全相同。
如何让此表单仅显示我想要的字段?
答案 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 ...