У меня есть пользовательская модель, подкласс 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'
ошибку.
Если я не передаю его, я получаю точно такую же форму со всеми полями, что и в административной информации.
Как я могу получить эту форму, показывая только те поля, которые я хочу?