2009-11-23 11 views
10

मेरे पास एक प्रश्न है कि मेरे डेटाबेस में मौजूदा पंक्ति को कैसे अपडेट किया जाए जब फ़ील्ड में से कोई मेरी प्राथमिक कुंजी है। मैं मॉडलफॉर्म और डीजेगो-पिस्टन का उपयोग कर रहा हूं - मेरा मुख्य लक्ष्य यहां है कि रीस्टफुल पोस्ट मेरे webservice को भेजना है। मैं प्रारंभिक पोस्ट सही ढंग से भेज सकता हूं (यानी कि प्राथमिक कुंजी मान अभी तक मौजूद नहीं है)। समस्या यह है कि जब मैं एक मान को अद्यतन करना चाहता हूं जहां प्राथमिक कुंजी पहले से मौजूद है - जब मैं f.is_valid() जारी करता हूं तो यह विफल हो जाता है क्योंकि "यह अद्वितीय पहचानकर्ता पहले से मौजूद है"। मौजूदा पंक्ति को अद्यतन करने के लिए मॉडलफॉर्म का उपयोग करके मैं फॉर्म सत्यापन कैसे कर सकता हूं?मॉडलफॉर्म का उपयोग करते समय मैं पहले से मौजूद पंक्ति को कैसे अपडेट करूं?

मेरे 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

यदि कोई उत्तर आपको आवश्यक जानकारी देता है, तो आपको इसे स्वीकार करना चाहिए (चेकमार्क पर क्लिक करें)। –

उत्तर

11

django docs "किसी मौजूदा [[इकाई]] को बदलने के लिए एक फार्म" कैसे बनाने के लिए एक सरल उदाहरण दे:

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

ऐसा लगता है के रूप में आप दोनों नए डालने के लिए एक ही प्रवाह उपयोग करना चाहते हैं ऑब्जेक्ट्स और मौजूदा लोगों को बदलना, आपको प्राथमिक कुंजी सफल (मौजूदा ऑब्जेक्ट) या असफल (नई ऑब्जेक्ट) की तलाश करने के आधार पर फॉर्म को अलग से चालू करना होगा! -)

+0

ग्रेट - जो दिया गया मैं क्या चाहता था! – letsgofast

+1

जब फॉर्म पर form.save() लागू होता है, तो उदाहरण को फॉर्म डेटा के साथ अपडेट किया जाना चाहिए? मेरा फॉर्म इसे नए उदाहरण में सहेज रहा है, यह खुद बना रहा है। – tilaprimera

10

कोई मौजूदा पंक्ति (या ORM बात में वस्तु) को अद्यतन करने के लिए आप का उपयोग करने के ModelForm क्या उदाहरण बताने के लिए है जब यह instantiating:

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

जहां पिस्टन का उपयोग करने से myobject मिल मुझे यकीन है कि नहीं कर रहा हूँ, हालांकि , लेकिन आपका प्रश्न यह इंगित करता है कि आपने उस विशेष समस्या को हल कर लिया है।

+0

यह मेरी समस्या का सही जवाब था। यह दस्तावेज (हालांकि खोजने में मुश्किल है) https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method (कोड बॉक्स में अंतिम उदाहरण देखें) – tutuDajuju

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?') 
संबंधित मुद्दे

 संबंधित मुद्दे