2012-03-31 18 views
7

Obserwuje działa poprawnie w skorupkach:Jak zaktualizować obiekt użytkownika bez tworzenia nowego?

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

Wtedy staram się zrobić to samo z form:

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

otworzyć stronę w przeglądarce i zobaczyć dwa pola First name i Last name. Kiedy wypełnić pola i wysłać formularz pojawia się błąd:

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

Próbowałem też dodać ['username'] do listy pól w UserForm. Gdybym przesłać formularz z moją nazwą użytkownika (jako request.user) wyświetla formularz ErrorMessage:

User with this Username already exists. 

jeśli mogę zmienić nazwę użytkownika do jakiejś unikalnej nazwy, nowy użytkownik o takiej nazwie jest tworzony.

Pytanie brzmi: Jak mogę zaktualizować obiekt użytkownika, a nie utworzyć nowy?

Przepraszam, że jestem taki gadatliwy, ale miałem trudne poszukiwania i nie mogłem znaleźć odpowiedzi na moje pytanie.

BTW, przypadki te nie działają na mnie:

EDIT:

Jak sugeruje @fceruti Właśnie dodano na żądanie uest.method == 'post' gałąź to:

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

Odpowiedz

19

Wystarczy dodać na request.method == 'post' gałąź to:

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

Tam nie być 'żądanie. user', jeśli jest to formularz rejestracji –

+1

, ale jest to formularz edycji użytkownika: P – fceruti

+0

ah przepraszam, nie przeczytałem nazwy widoku –

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

Ta wersja działa również, dziękuję za pomoc! Z wyjątkiem jednej chwili: myślę, że podwójna gwiazdka powinna przejść przed kwargs 'form = UserForm (** kwargs)' –

+0

W ten sposób spowoduje dodatkowe wyszukiwanie DB, więc @fceruti rozwiązanie jest o wiele lepsza w tej sytuacji. W ten sposób warto wiedzieć o innych przypadkach –

Powiązane problemy