2009-11-23 39 views
10

Tôi có câu hỏi về cách cập nhật hàng hiện tại trong cơ sở dữ liệu của mình khi một trong các trường là khóa chính của tôi. Tôi đang sử dụng ModelForm và Django-Piston - mục tiêu chính của tôi ở đây là có RESTful Post gửi đến webservice của tôi. Tôi có thể gửi bài viết ban đầu chính xác (nghĩa là giá trị khóa chính chưa tồn tại). Vấn đề là khi tôi muốn cập nhật một giá trị mà khóa chính đã tồn tại - khi tôi phát hành một f.is_valid() nó không thành công vì "UniqueIdentifier này đã tồn tại". Làm cách nào để tôi có thể thực hiện xác thực biểu mẫu bằng cách sử dụng ModelForms để cập nhật hàng hiện tại?Làm cách nào để cập nhật hàng đã tồn tại khi sử dụng ModelForms?

models.py của tôi:

from django.db import models 
class DeviceModel(models.Model): 
    uniqueIdentifier = models.CharField(primary_key=True, max_length=100) 
    deviceToken = models.CharField(max_length=100) 

forms.py

from django import forms 
from models import DeviceModel 
class DeviceModelForm(forms.ModelForm): 
    class Meta: 
     model = DeviceModel 

handlers.py

class DeviceHandler(BaseHandler): 
allowed_methods = ('POST', 'GET', 'DELETE',) 
def create(self, request): 
    f = DeviceModelForm(request.POST) 
    if f.is_valid(): 
     new_object = f.save() 
     return new_object 
    return rc.BAD_REQUEST 

urls.py

from django.conf.urls.defaults import * 
from piston.resource import Resource 
from api.handlers import DeviceHandler 

device_handler = Resource(DeviceHandler) 

urlpatterns = patterns('', 
    (r'^api/$', device_handler, {'emitter_format': 'json'}), 
) 
+0

Nếu câu trả lời cung cấp cho bạn thông tin bạn cần, bạn nên chấp nhận thông tin đó (nhấp vào dấu kiểm). –

Trả lời

11

Các django docs đưa ra một ví dụ đơn giản về cách để tạo ra "một hình thức để thay đổi một [[tổ chức]] hiện":

>>> article = Article.objects.get(pk=1) 
>>> form = ArticleForm(instance=article) 

Nếu như có vẻ như bạn muốn sử dụng cùng một dòng chảy cho cả chèn mới đối tượng và thay đổi các đối tượng hiện có, bạn sẽ phải tạo biểu mẫu riêng biệt tùy thuộc vào việc tìm kiếm khóa chính thành công (đối tượng hiện có) hay không (đối tượng mới)! -)

+0

Tuyệt vời - đã cho những gì tôi muốn! – letsgofast

+1

Khi form.save() được áp dụng trên biểu mẫu, cá thể cần được cập nhật với dữ liệu biểu mẫu? Biểu mẫu của tôi đang lưu nó vào một cá thể mới, nó đang tự tạo ra nó. – tilaprimera

10

Để cập nhật hàng hiện có (hoặc đối tượng trong ORM-nói), bạn phải nói với các ModelForm gì dụ để sử dụng khi instantiating nó:

f = DeviceModelForm(request.POST, instance=myobject) 

Tôi không chắc chắn mà bạn nhận được từ việc sử dụng myobject piston, mặc dù , nhưng câu hỏi của bạn dường như ngụ ý rằng bạn đã giải quyết vấn đề cụ thể đó rồi.

+0

Đây là câu trả lời đúng cho vấn đề của tôi. Đó là tài liệu (mặc dù khó tìm) ở đây https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method (xem ví dụ cuối cùng trong hộp mã) – tutuDajuju

2

Đây là giải pháp hoàn chỉnh hơn các câu trả lời và nhận xét khác trên trang này. Tôi có nó hoạt động như một câu trả lời cho ajax jquery.

def Save_product(request):                  
    if request.method == "POST":                 
     # first get the model pk we are looking for 
     postpk = request.POST.get('pk', None) 

     # get the model from the db             
     model, created = Product.objects.get_or_create(pk = postpk)       

     # create the from based on the model, but with the 
     # request data overriding the model data             
     form = ProductForm(request.POST, instance = model) 

     # save if valid          
     if form.is_valid():                  
      form.save()                   
      return HttpResponse("saved");               
     else:        
      # will go to the the ajax error: data.responseText              
      return HttpResponseNotFound("%s" % (form.errors))          
    else:                       
     return HttpResponseNotFound('eh? this was not a Post?') 
Các vấn đề liên quan