2012-03-31 15 views
7

seguito alle opere eccellenti in guscio:Come aggiornare l'oggetto Utente senza crearne uno nuovo?

>>> 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' 

poi cerco di fare lo stesso con le forme:

# 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> 

apro pagina in del browser e vedere due campi First name e Last name. Quando ho compilare i campi e inviare il modulo ottengo l'errore:

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

Ho anche provato ad aggiungere alla lista ['username'] campi in form. Se posso inviare il modulo con il mio nome utente (come request.user), la forma viene visualizzato errorMessage:

User with this Username already exists. 

Se cambio il nome utente per qualche nome univoco, viene creato il nuovo utente con quel nome utente.

La domanda è: Come posso aggiornare l'oggetto Utente, non crearne uno nuovo?

Mi dispiace per essere stato così prolisso, ma ho avuto una ricerca difficile qui e non ho trovato la risposta alla mia domanda.

BTW, questi casi non funzionano per me:

EDIT:

come suggerito @fceruti ho appena aggiunto su req uest.method == 'post' ramo questo:

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

risposta

19

basta aggiungere il request.method == ramo 'post' questo:

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

non ci sarà un 'richiesta. utente' se questo è un modulo di registrazione –

+1

ma è un modulo utente di modifica: P – fceruti

+0

ah scusa, non ho letto il nome della 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

Questa versione funziona anche, grazie per il tuo aiuto! Tranne un momento: penso che il doppio asterisco dovrebbe andare prima di kwargs 'form = UserForm (** kwargs)' –

+0

In questo modo causerà una ricerca DB aggiuntiva così la soluzione di @fceruti è molto meglio in questa situazione, tuttavia è utile sapere per altre istanze –

Problemi correlati