2012-03-31 18 views
7

siguientes trabajos finos con cáscara:¿Cómo actualizar el objeto Usuario sin crear uno nuevo?

>>> from django.contrib.auth.models import User 
>>> user=User.objects.get(pk=1) 
>>> user.first_name = u'Some' 
>>> user.last_name = u'Name' 
>>> user.save() 
>>> user.first_name 
u'Some' 
>>> user.last_name 
u'Name' 

entonces trato de hacer lo mismo con las formas:

# forms.py 
class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['first_name', 'last_name'] 


# views.py 
def edit_names(request, template_name="registration/edit_names.html"): 
    if request.method == "POST": 
     form = UserForm(data=request.POST) 
     if form.is_valid(): 
      user = form.save(commit=False) 
      user.save() 
      url = urlresolvers.reverse('my_account') 
      return HttpResponseRedirect(url) 
    else: 
     form = UserForm(instance=request.user) 
    page_title = _('Edit user names') 
    return render_to_response(template_name, locals(), 
     context_instance=RequestContext(request)) 

# edit_names.html 
<form action="." method="post">{% csrf_token %} 
    <table> 
     {{ form.as_table }} 
     <tr><td colspan="2"> 
      <input type="submit" /> 
     </td></tr> 
    </table> 
</form> 

puedo abrir la página en el navegador y ver dos campos First name y Last name. Cuando relleno en los campos y enviar el formulario consigo el error:

Exception Type: IntegrityError 
Exception Value: column username is not unique 

También probé añadir ['username'] a la lista de campos de formulario de usuario. Si presento el formulario con mi nombre de usuario (como request.user), se muestra el formulario ErrorMessage:

User with this Username already exists. 

Si cambio el nombre de usuario para un nombre único, se crea el nuevo usuario con ese nombre de usuario.

La pregunta es: ¿Cómo puedo actualizar el objeto de usuario, no crear uno nuevo?

Lo siento por ser tan detallado, pero tuve una búsqueda difícil aquí y no pude encontrar la respuesta a mi pregunta.

Por cierto, estos casos no funcionan para mí:

EDIT:

como se sugiere @fceruti acabo agregado en req uest.method == 'post' rama esto:

form = UserForm(data=request.POST, instance=request.user) 

Respuesta

19

Sólo añadir en request.method == 'post' rama esto:

form = UserForm(data=request.POST, instance=request.user) 
+0

no habrá una 'petición. user' si se trata de un formulario de registro –

+1

pero es un formulario de usuario de edición: P – fceruti

+0

¡Ah, lo siento, no leí el nombre de la vista –

3
if request.method == "POST": 
    kwargs = { 'data' : request.POST } 
    try: 
     kwargs['instance'] = User.objects.get(username=request.POST['username']) 
    except: 
     pass 
    form = UserForm(kwargs**) 
    if form.is_valid(): 
     user = form.save(commit=False) 
     ... 
+1

Esta versión también funciona, gracias por su ayuda! Excepto un momento: creo que el doble asterisco debe ir antes de kwargs 'formulario = UserForm (** kwargs)' –

+0

De esta manera causará una búsqueda DB adicional para la solución @fceruti es mucho mejor en esta situación. De esta manera es útil saber para otras instancias –

Cuestiones relacionadas