2012-03-31 35 views
7

công trình sau tốt trong vỏ:Làm cách nào để cập nhật đối tượng Người dùng mà không cần tạo đối tượng mới?

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

Sau đó, tôi cố gắng làm điều tương tự với các hình thức:

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

tôi mở trang trong trình duyệt và xem hai lĩnh vực First nameLast name. Khi tôi điền vào các trường và gửi biểu mẫu tôi nhận được lỗi:

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

Tôi cũng cố gắng thêm ['username'] vào danh sách các lĩnh vực trong UserForm. Nếu tôi gửi biểu mẫu với Tên truy nhập của tôi (như request.user), hiển thị dạng ERRORMESSAGE:

User with this Username already exists. 

Nếu tôi thay đổi tên người dùng đối với một số tên duy nhất, người dùng mới với tên người dùng mà đang được tạo ra.

Câu hỏi đặt ra là: Làm cách nào để cập nhật Đối tượng người dùng, không tạo đối tượng mới?

Xin lỗi vì đã quá chi tiết, nhưng tôi đã tìm kiếm khó khăn ở đây và không thể tìm thấy câu trả lời cho câu hỏi của mình.

BTW, những trường hợp này không làm việc cho tôi:

EDIT:

Như đã đề cập @fceruti Tôi chỉ được thêm vào req uest.method == 'bài' chi nhánh này:

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

Trả lời

19

Chỉ cần thêm vào request.method == 'bài' chi nhánh này:

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

Sẽ không có một 'yêu cầu. người dùng' nếu đây là biểu mẫu đăng ký –

+1

nhưng đó là biểu mẫu chỉnh sửa người dùng: P – fceruti

+0

xin lỗi, tôi không đọc tên chế độ xem –

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

Phiên bản này cũng hoạt động, cảm ơn bạn đã giúp đỡ! Ngoại trừ một khoảnh khắc: Tôi nghĩ rằng dấu hoa thị kép nên đi trước kwargs 'form = UserForm (** kwargs)' –

+0

Bằng cách này sẽ gây thêm tra cứu DB để giải pháp @fceruti tốt hơn nhiều trong tình huống này, cách này rất hữu ích để biết các trường hợp khác mặc dù –

Các vấn đề liên quan