Проблемы с отображением обновлений пользователя - PullRequest
0 голосов
/ 18 января 2019

У меня есть пользовательская модель, подкласс 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 голосов
/ 18 января 2019

Одним из решений будет создание подкласса 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 ...
...