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:
- Extending UserCreationForm to include email, first name, and last name
- add field first_name and last_name in django-profile
- How to create a UserProfile form in Django with first_name, last_name modifications?
EDIT:
Jak sugeruje @fceruti Właśnie dodano na żądanie uest.method == 'post' gałąź to:
form = UserForm(data=request.POST, instance=request.user)
Tam nie być 'żądanie. user', jeśli jest to formularz rejestracji –
, ale jest to formularz edycji użytkownika: P – fceruti
ah przepraszam, nie przeczytałem nazwy widoku –