2012-03-31 166 views
7

殼以下罰款作品:如何更新用戶對象而不創建新對象?

>>> 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 nameLast name。當我填寫以下字段並提交表單我得到的錯誤:

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

我也嘗試添加['username']到字段列表中的窗體。如果我提交表單與我的用戶名(如request.user),窗體顯示ERRORMESSAGE:

User with this Username already exists. 

如果我改變用戶名來一些獨特的名字,正在創建使用該用戶名新用戶。

現在的問題是: 如何更新用戶對象,而不是創建新的?

對不起,如此詳細,但我在這裏很難搜索,找不到我的問題的答案。

BTW,這種情況下不爲我工作:

編輯:

由於只是建議@fceruti我在req上添加uest.method == '後' 分支這樣的:

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

回答

19

上request.method只需添加== '後' 分支這樣的:

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

不會有一個'請求。用戶'如果這是一個註冊表格 – 2012-03-31 15:58:16

+1

但它是一個編輯用戶表格:P – fceruti 2012-03-31 15:59:43

+0

啊對不起,我沒有閱讀視圖名稱 – 2012-03-31 16:02:02

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

這個版本也有效,謝謝你的幫助!除了一個時刻:我認爲雙星號應該在kwargs之前出現 'form = UserForm(** kwargs)' – 2012-03-31 16:38:40

+0

這樣會導致額外的數據庫查找,所以@fceruti解決方案在這種情況下要好得多。這種方法對於其他實例很有用 – 2012-03-31 19:23:49

相關問題