2009-11-23 5 views
10

Ho una domanda su come aggiornare una riga esistente nel mio database quando uno dei campi è la mia chiave primaria. Sto usando ModelForm e Django-Piston: il mio obiettivo principale è quello di inviare RESTful Post al mio webservice. Sono in grado di inviare Post iniziali correttamente (ovvero che il valore della chiave primaria non esiste ancora). Il problema è quando voglio aggiornare un valore in cui la chiave primaria esiste già - quando emetto un f.is_valid() fallisce perché "questo UniqueIdentifier esiste già". Come posso fare la convalida del modulo usando ModelForms per aggiornare una riga esistente?Come aggiornare una riga già esistente quando si utilizza ModelForms?

mio 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

Se una risposta ti ha fornito le informazioni necessarie, devi accettarlo (fai clic sul segno di spunta). –

risposta

11

Il django docs invia un semplice esempio di come creare "un modulo per modificare un [[entità]] esistente":

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

Se come sembra che si desidera utilizzare lo stesso flusso sia per l'inserimento di nuovi oggetti e cambiando quelli esistenti, dovrai istanziare il modulo separatamente a seconda che cerchi la chiave primaria abbia successo (oggetto esistente) o fallisca (nuovo oggetto)! -)

+0

Great - che ha dato io quello che volevo! – letsgofast

+1

Quando si applica form.save() sul modulo, l'istanza deve essere aggiornata con i dati del modulo? Il mio modulo lo sta salvando in una nuova istanza, si sta facendo da solo. – tilaprimera

10

Per aggiornare una riga esistente (o di un oggetto in ORM-parlare), si deve dire al ModelForm cosa istanza da utilizzare quando si crea un'istanza esso:

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

Non sono sicuro di dove si ottiene myobject usare i pistoni, anche se , ma la tua domanda sembra implicare che hai già risolto quel particolare problema.

+0

Questa era la risposta corretta per il mio problema. È documentato (sebbene difficile da trovare) qui https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method (vedi l'ultimo esempio nella casella del codice) – tutuDajuju

2

Ecco una soluzione più completa, che riunisce le altre risposte e commenti su questa pagina. Ho funzionato come risposta a un 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?')