Как создать функцию обновления для Django AbstractUser

Я создал регистрацию /логин с помощью "UserCreationForm". Как я могу сделать возможным обновление с помощью "UserChangeForm"? models.py

from django.contrib.auth.models
import AbstractUser

# Create your models here.
class CustomUser(AbstractUser): pass
def __str__(self): return self.username

forms.py

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

class CustomUserCreationForm(UserCreationForm): class Meta(UserCreationForm): model = CustomUser fields = ('first_name', 'last_name', 'username', 'email')

class CustomUserChangeForm(UserChangeForm): class Meta: model = CustomUser fields = ('first_name', 'last_name', 'username', 'email')

views.py

from django.shortcuts import render, redirect

# Create your views here. 
from django.urls import reverse_lazy from django.views.generic.edit import CreateView from django.views import View

from .forms import CustomUserCreationForm, CustomUserChangeForm from .models import CustomUser

class SingUpView(CreateView): form_class = CustomUserCreationForm success_url = reverse_lazy('login') template_name = 'signup.html'

#выдает ошибку
class CustomUserUpdateView(View):
def get(self, request, *args, **kwargs):
user_id = kwargs.get("id")
user = CustomUser.objects.get(id=user_id)
form = CustomUserChangeForm(instance=user)
return render(
request, "users/update.html", {"form": form, "user_id": user_id}
)

def post(self, request, *args, **kwargs):
user_id = kwargs.get("id")
user = CustomUser.objects.get(id=user_id)
form = CustomUserChangeForm(request.POST, instance=user)
if form.is_valid():
form.save()
return redirect("users_list")
return render(
request, "users/update.html", {"form": form, "user_id": user_id}
)

Я пытался создать update с наследованием класса View, включая методы 'get/post', но при этом возникает ошибка

CustomUser matching query does not exist.

Я сделал все, что мне сказал Google, чтобы активировать get/post (я проверил пользователя в настройках, попытался добавить try/except и использовать get_user_model), но ничего из этого не сработало.

Ваша ошибка связана с тем, что URL-адрес не содержит id. Добавьте его в urls.py:

path("user/<int:id>/update/", CustomUserUpdateView.as_view(), name="user_update"),

Затем используйте get_object_or_404 вместо .get():

user = get_object_or_404(CustomUser, id=kwargs["id"])

Вот и все — проблема не в форме, а в том, как представление получает id.

ошибка CustomUser matching query does not exist связана не с вашими методами просмотра, а с несоответствием между вашим параметром URL и тем, как вы извлекаете пользователя

в users/urls.py

path('<int:user_id>/update/', views.CustomUserUpdateView.as_view(), name='users_update'),

вы используете <int:user_id> в качестве параметра URL, поэтому в вашем представлении вместо id вы должны использовать user_id

ваш взгляд

user_id = kwargs.get("id")
user = CustomUser.objects.get(id=user_id)

должно быть вот так

user_id = kwargs.get("user_id")  # match the URL parameter
user = CustomUser.objects.get(id=user_id)

или вы можете просто изменить users/urls.py вот так

path('<int:id>/update/', views.CustomUserUpdateView.as_view(), name='users_update'),

Используйте UpdateView с request.user в качестве объекта для обновления:

class CustomUserUpdateView(UpdateView):
    form_class = CustomUserChangeForm
    template_name = "users/update.html"
    
    def get_object(self):
        return self.request.user
Вернуться на верх