15

フィールドの 1 つが主キーである場合に、データベース内の既存の行を更新する方法について質問があります。私は ModelForm と Django-Piston を使用しています。ここでの主な目標は、RESTful Post を Web サービスに送信することです。最初の投稿を正しく送信できました (つまり、主キーの値がまだ存在していません)。問題は、プライマリ キーが既に存在する値を更新する場合です。f.is_valid() を発行すると、「この UniqueIdentifier は既に存在する」ため失敗します。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)

フォーム.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'}),
)
4

4 に答える 4

19

djangoのドキュメントには、「既存の[[entity]]を変更するフォーム」を作成する簡単な例が示されています。

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

新しいオブジェクトの挿入と既存のオブジェクトの変更の両方に同じフローを使用したい場合は、主キーの検索が成功するか(既存のオブジェクト)、失敗するか(新しいオブジェクト)に応じて、フォームを個別にインスタンス化する必要があります。 -)

于 2009-11-23T00:34:04.393 に答える
17

既存の行(またはORM-speakのオブジェクト)を更新するにはModelForm、インスタンス化するときに使用するインスタンスを指定する必要があります。

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

ピストンを使用することでどこが得られるかはわかりませんmyobjectが、あなたの質問は、その特定の問題をすでに解決したことを示唆しているようです。

于 2009-11-23T00:28:16.383 に答える
5

これは、クラスベースのビューを使用しないより完全なソリューションであり、このページの他の回答とコメントをまとめています。

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?')   
于 2017-01-07T13:00:55.183 に答える