Следующее прекрасно работает в оболочке:
>>> 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'
Затем я пытаюсь сделать то же самое с формами:
# 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>
Я открываю страницу в браузере и вижу два поля First name
иLast name
.Когда я заполняю поля и отправляю форму, я получаю сообщение об ошибке:
Exception Type: IntegrityError
Exception Value: column username is not unique
Я также пытался добавить ['username']
в список полей в пользовательской форме.Если я отправляю форму с моим именем пользователя (как request.user), форма отображает сообщение об ошибке:
User with this Username already exists.
Если я изменяю имя пользователя на какое-то уникальное имя, создается новый пользователь с таким именем.
Вопрос в следующем: Как я могу обновить объект пользователя, а не создать новый?
Извините, что я так многословен, но у меня был сложный поиск здесь, и я не смог найтиответьте на мой вопрос.
Кстати, эти случаи не работают для меня:
РЕДАКТИРОВАТЬ:
Как и предлагалось @fceruti, я только что добавил в request.method == ветку 'post' это:
form = UserForm(data=request.POST, instance=request.user)