How to create an update function for a Django AbstractUser
I created signup/login with 'UserCreationForm'. How can I make update possible by using '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}
)
I've been trying to create update with inheritance of the View class including 'get/post' methods, but it raises an error
CustomUser matching query does not exist.
I did everything google told me to activate get/post (I checked user in the settings, tried to add try/except and use get_user_model) but none of that has worked out.
Your error comes from the URL not passing an id. Add it in urls.py:
path("user/<int:id>/update/", CustomUserUpdateView.as_view(), name="user_update"),
Then use get_object_or_404 instead of .get():
user = get_object_or_404(CustomUser, id=kwargs["id"])
That’s all — the problem isn’t in the form, but in how the view gets the id.
the error CustomUser matching query does not exist is not about your view methods its about a mismatch between your URL parameter and how you retrieve the user
in users/urls.py
path('<int:user_id>/update/', views.CustomUserUpdateView.as_view(), name='users_update'),
you are using <int:user_id> as the URL parameter so in your view instaed of id you should use user_id
your view
user_id = kwargs.get("id")
user = CustomUser.objects.get(id=user_id)
should be like this
user_id = kwargs.get("user_id") # match the URL parameter
user = CustomUser.objects.get(id=user_id)
or you can just change users/urls.py like this
path('<int:id>/update/', views.CustomUserUpdateView.as_view(), name='users_update'),
Use an UpdateView with the request.user as object to update:
class CustomUserUpdateView(UpdateView):
form_class = CustomUserChangeForm
template_name = "users/update.html"
def get_object(self):
return self.request.user