2009-11-23 44 views
10

我有一個關於如何更新我的數據庫中的現有行時,其中一個字段是我的主鍵的問題。我使用ModelForm和Django-Piston - 我的主要目標是讓RESTful Post發送到我的web服務。我能夠正確發送初始郵件(即,主鍵值尚不存在)。問題是當我想更新主鍵已經存在的值時 - 當我發出f.is_valid()時,它失敗了,因爲「這個UniqueIdentifier已經存在」。我如何使用ModelForms進行表單驗證來更新現有的行?如何在使用ModelForms時更新已存在的行?

我的models.py:

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

如果答案爲您提供了所需的信息,您應該接受它(單擊對號)。 – 2009-11-23 20:46:18

回答

11

django docs給出瞭如何創建一個簡單的例子,「一個形式來改變現有的[實體]」:

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

如果因爲它似乎要使用相同的流插入新兩對象和改變現有的對象,你必須根據是否查找主鍵成功(現有對象)或失敗(新對象)來分別實例化表單! - )

+0

太好了 - 那給了我想要什麼! – letsgofast 2009-11-23 01:07:51

+1

當窗體上應用form.save()時,應該使用窗體數據更新實例?我的表單正在將它保存到新的實例中,它正在創建它自己。 – tilaprimera 2014-11-28 09:50:39

10

要更新現有的行(或對象ORM-說吧),你必須告訴ModelForm什麼情況下使用實例化時:

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

我不知道你在哪裏使用活塞得到myobject,雖然,但你的問題似乎意味着你已經解決了這個特定的問題。

+0

這是我的問題的正確答案。它有記載(雖然很難找到)在這裏https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method(見代碼框中的最後一個例子) – tutuDajuju 2012-03-23 20:17:03

2

這是一個更完整的解決方案,其他答案和評論在這個頁面上。 我有它作爲一個jQuery Ajax回覆工作。

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?') 
相關問題