2011-05-30 10 views
24

Estoy tratando de actualizar el modelo de usuario de Django con la clase basada en UpdateView que se representa automáticamente con el usuario actual pero obtengo el error de que se requiere un pk o slug. El formulario funciona y representa con el contexto de usuario actual correcto, pero arroja el error cuando intento enviar los cambios. A continuación se muestra la vista que estoy utilizando:Actualizando el modelo de usuario en Django con la clase basada en UpdateView

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()) 

Respuesta

26

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

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

En realidad self.request.user es una instancia de usuario. – nemith

4

Sé que esto es una entrada antigua, pero algo se destacó para mí y este comentario es información para los recién llegados.

La llamada GET para self.object funcionará pero no se emparejan los campos reales para obtener nombre de usuario, ya que está suministrando la instancia de usuario:

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

Usted debe coincidir con el argumento de nombre de usuario con el argumento ejemplo, nombre de usuario:

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

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

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

Podría haber una manera más clara de hacerlo, así que estoy abierto a sugerencias.

Cuestiones relacionadas