usuarios usuario tutorial modelo make gestion form extendido extender auth django django-forms django-class-based-views

tutorial - Actualización del modelo de usuario en Django con UpdateView basado en clase



modelo de usuario extendido django (2)

Necesito anular el método get_object() en la vista de actualización y no necesito anular form_valid. El get_object() personalizado de get_object() es:

def get_object(self, queryset=None): return self.request.user

Estoy tratando de actualizar el modelo de Usuario de Django con la Vista de Clase basada en UpdateView que se procesa automáticamente con el usuario actual, pero obtengo el error de que pk o slug es necesario. El formulario funciona y se procesa con el contexto de usuario actual adecuado, pero arroja el error cuando intento enviar los cambios. A continuación se muestra la vista que estoy usando:

class UserUpdateView(UpdateView): form_class = UserForm model = User template_name = ''members/user_update.html'' def get(self, request, **kwargs): self.object = User.objects.get(username=self.request.user) form_class = self.get_form_class() form = self.get_form(form_class) context = self.get_context_data(object=self.object, form=form) return self.render_to_response(context) def form_valid(self, form): self.object = form.save(commit=False) self.object.user = self.request.user self.object.save() return HttpResponseRedirect(self.get_success_url())


Sé que este es un post antiguo, pero algo me llamó la atención y este comentario es información para los recién llegados.

La llamada de obtención para self.object funcionará, pero no coincide con los campos reales para obtener el nombre de usuario, ya que proporciona la instancia de usuario:

self.object = User.objects.get(username=self.request.user)

Debe hacer coincidir el argumento de nombre de usuario con el argumento de nombre de usuario de instancia:

self.object = User.objects.get(username=self.request.user.username)

Mejor aún, usa el pk (id):

self.object = User.objects.get(pk=self.request.user.pk)

Podría haber una forma más ordenada de hacer esto, así que estoy abierto a sugerencias.