Как обновить объект пользователя, не создавая новый? - PullRequest
9 голосов
/ 31 марта 2012

Следующее прекрасно работает в оболочке:

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

Ответы [ 2 ]

20 голосов
/ 31 марта 2012

Просто добавьте в request.method == ветку 'post' это:

form = UserForm(data=request.POST, instance=request.user)
3 голосов
/ 31 марта 2012
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)
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...