简体   繁体   中英

Django: Update user fields using a custom form

Staff members can register/update profile of users. My registration function works fine, but not the profile update.

I'm getting this error: 'int' object has no attribute '_meta'.

forms.py

from django.contrib.auth.forms import UserCreationForm, UserChangeForm

class RegisterForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False)
    last_name = forms.CharField(max_length=30, required=False)
    Group = [('Viewers', 'Viewers'), ('Editors', 'Editors'), ('Creators', 'Creators'), ('Staff', 'Staff'), ]
    group_name = forms.ChoiceField(choices=Group)
    is_active = forms.BooleanField(initial=True, required=False)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', 'group_name', 'is_active', )


class UpdateForm(UserChangeForm):
    is_active = forms.BooleanField(required=False)
    Group = [('Viewers', 'Viewers'), ('Editors', 'Editors'), ('Creators', 'Creators'), ('Staff', 'Staff'), ]
    group_name = forms.ChoiceField(choices=Group)

    class Meta:
        model = User
        fields = ('email', 'is_active', 'group_name', )

views.py

@login_required
@group_required('Staff')
def registerView(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            group = Group.objects.get(name=request.POST.get('group_name'))
            user.groups.add(group)
            return redirect('accounts:users')
    else:
        form = RegisterForm()

    return render(request, 'accounts/register.html', {'form': form})


# Update status of user
@login_required
@group_required('Staff')
def updateUserView(request, id):
    if request.method == 'POST':
        form = UpdateForm(request.POST, instance=id)
        if form.is_valid():
            user = form.save()
            group = Group.objects.get(name=request.POST.get('group_name'))
            user.groups.add(group)
            return redirect('accounts:users')
    else:
        form = UpdateForm(instance=id)

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


urls.py

path('users/<int:id>/update', views.updateUserView, name='update'),

What am I missing? Is there an easier way to do it?

You have to give your UpdateForm an instance, not just the ID.

This:

form = UpdateForm(instance=id)

Should be something like:

form = UpdateForm(instance=User.objects.get(id=id))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM