2012-02-03 14 views
6

क्या कोई पूर्ण tastypie django उदाहरण साइट और सेटअप डाउनलोड के लिए उपलब्ध है? मैं पूरे दिन अपने सिर को लपेटने के साथ कुश्ती कर रहा हूं। मेरे पास निम्न कोड है। असल में, मेरे पास एक पोस्ट फॉर्म है जिसे अजाक्स के साथ संभाला जाता है। जब मैं अपने फॉर्म पर "सबमिट" पर क्लिक करता हूं और AJAX अनुरोध चलता है, तो कॉल "POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (नहीं मिला)" मेरे पास यूआरएल कॉन्फ़िगर किया गया है, मुझे लगता है। मैं http://192.168.1.110:8000/api/private/client_basic_info/?format=json बस ठीक कर सकता हूं। क्या मुझे कुछ सेटिंग्स याद आ रही हैं या मेरी विधियों में कुछ मौलिक त्रुटियां हैं? मेरा इरादा यह है कि प्रत्येक उपयोगकर्ता एक और केवल एक "ग्राहक मूलभूत जानकारी" फ़ॉर्म/मॉडल भर सकता/संशोधित कर सकता है।tastypie पोस्टिंग और पूर्ण उदाहरण

एक पेज:

{% extends "layout-column-100.html" %} 
{% load uni_form_tags sekizai_tags %} 

{% block title %}Basic Information{% endblock %} 

{% block main_content %} 

    {% addtoblock "js" %} 
     <script language="JavaScript"> 

     $(document).ready(function() { 

      $('#client_basic_info_form').submit(function (e) { 

       form = $(this) 

       form.find('span.error-message, span.success-message').remove() 
       form.find('.invalid').removeClass('invalid') 
       form.find('input[type="submit"]').attr('disabled', 'disabled') 

       e.preventDefault(); 
       var values = {} 

       $.each($(this).serializeArray(), function(i, field) { 
        values[field.name] = field.value; 
       }) 


       $.ajax({ 
        type: 'POST', 
        contentType: 'application/json', 
        data: JSON.stringify(values), 
        dataType: 'json', 
        processData: false, 
        url: '/api/private/client_basic_info/', 
        success: function(data, status, jqXHR) { 
         form.find('input[type="submit"]') 
          .after('<span class="success-message">Saved successfully!</span>') 
          .removeAttr('disabled') 
        }, 
        error: function(jqXHR, textStatus, errorThrown) { 

         console.log(jqXHR) 
         console.log(textStatus) 
         console.log(errorThrown) 

         var errors = JSON.parse(jqXHR.responseText) 
         for (field in errors) { 
          var field_error = errors[field][0] 
          $('#id_' + field).addClass('invalid') 
           .after('<span class="error-message">'+ field_error +'</span>') 
         } 
         form.find('input[type="submit"]').removeAttr('disabled') 
        } 
       }) // end $.ajax() 

      }) // end $('#client_basic_info_form').submit() 

     }) // end $(document).ready() 

     </script> 
    {% endaddtoblock %} 


{% uni_form form form.helper %} 


{% endblock %} 

संसाधनों

from residence.models import ClientBasicInfo 
from residence.forms.profiler import ClientBasicInfoForm 

from tastypie import fields 
from tastypie.resources import ModelResource 
from tastypie.authentication import BasicAuthentication 
from tastypie.authorization import DjangoAuthorization, Authorization 
from tastypie.validation import FormValidation 
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS 
from django.core.urlresolvers import reverse 
from django.contrib.auth.models import User 

class UserResource(ModelResource): 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     fields = ['username'] 
     filtering = { 
      'username': ALL, 
     } 
     include_resource_uri = False 
     authentication = BasicAuthentication() 
     authorization = DjangoAuthorization() 

    def dehydrate(self, bundle): 
     forms_incomplete = [] 

     if ClientBasicInfo.objects.filter(user=bundle.request.user).count() < 1: 
      forms_incomplete.append({'name': 'Basic Information', 'url': reverse('client_basic_info')}) 

     bundle.data['forms_incomplete'] = forms_incomplete 
     return bundle 


class ClientBasicInfoResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 


    class Meta: 
     authentication = BasicAuthentication() 
     authorization = DjangoAuthorization() 
     include_resource_uri = False 
     queryset = ClientBasicInfo.objects.all() 
     resource_name = 'client_basic_info' 
     validation = FormValidation(form_class=ClientBasicInfoForm) 
     list_allowed_methods = ['get', 'post', ] 
     detail_allowed_methods = ['get', 'post', 'put', 'delete'] 

संपादित करें:

मेरे संसाधन फ़ाइल है:

from residence.models import ClientBasicInfo 
from residence.forms.profiler import ClientBasicInfoForm 

from tastypie import fields 
from tastypie.resources import ModelResource 
from tastypie.authentication import BasicAuthentication 
from tastypie.authorization import DjangoAuthorization, Authorization 
from tastypie.validation import FormValidation 
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS 
from django.core.urlresolvers import reverse 
from django.contrib.auth.models import User 

class UserResource(ModelResource): 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     fields = ['username'] 
     filtering = { 
      'username': ALL, 
     } 
     include_resource_uri = False 
     authentication = BasicAuthentication() 
     authorization = DjangoAuthorization() 

    #def apply_authorization_limits(self, request, object_list): 
    # return object_list.filter(username=request.user) 

    def dehydrate(self, bundle): 
     forms_incomplete = [] 

     if ClientBasicInfo.objects.filter(user=bundle.request.user).count() < 1: 
      forms_incomplete.append({'name': 'Basic Information', 'url': reverse('client_basic_info')}) 

     bundle.data['forms_incomplete'] = forms_incomplete 
     return bundle 


class ClientBasicInfoResource(ModelResource): 
    # user = fields.ForeignKey(UserResource, 'user') 

    class Meta: 
     authentication = BasicAuthentication() 
     authorization = DjangoAuthorization() 
     include_resource_uri = False 
     queryset = ClientBasicInfo.objects.all() 
     resource_name = 'client_basic_info' 
     validation = FormValidation(form_class=ClientBasicInfoForm) 
     #list_allowed_methods = ['get', 'post', ] 
     #detail_allowed_methods = ['get', 'post', 'put', 'delete'] 

    def apply_authorization_limits(self, request, object_list): 
     return object_list.filter(user=request.user) 

मैं ClientBasicInfo नल के उपयोगकर्ता क्षेत्र बनाया एक डी पोस्ट काम करने लगता है। मैं अब प्रविष्टि को अपडेट करने का प्रयास करना चाहता हूं। क्या वह सिर्फ एजेक्स यूआरएल में पीके जोड़ रहा है? उदाहरण के लिए/api/private/client_basic_info/21 /? जब मैं उस फॉर्म को जमा करता हूं तो मुझे 501 लागू संदेश नहीं मिलता है। मैंने वास्तव में क्या लागू नहीं किया है? मैं ModelResource subclassing कर रहा हूँ, जो दस्तावेजों के अनुसार लागू सभी ओआरएम से संबंधित कार्यों होना चाहिए।

+0

शायद APPEND_SLASHES के साथ कुछ समस्या हो सकती है? क्या आपने http://192.168.1.110:8000/api/private/client_basic_info पर पोस्ट करने का प्रयास किया है (बिना स्लैश के पीछे)? केवल अनुमान है। – nisc

+0

हम्म मैंने यूआरएल को स्लैश लिया और "आप इस यूआरएल को POST के माध्यम से बुलाया, लेकिन यूआरएल स्लैश में खत्म नहीं होता है और आपके पास एपीपी END_SLASH सेट है।" मैंने एपीपी END_SLASH = मेरी सेटिंग्स पर झूठा लगाया और अब मुझे 403 निषिद्ध संदेश (सीएसआरएफ सत्यापन विफल) मिला है। मैं csrf_exempt देखने के द्वारा पिछले हो गया है। अब मुझे 501 लागू त्रुटि नहीं मिली है। मैंने एक कस्टम हाइड्रेट फ़ंक्शन जोड़ा और उसे पिछले कर दिया। मैं वस्तु को अद्यतन करने के लिए एक फॉर्म जमा करने का प्रयास करता हूं लेकिन मुझे एक और त्रुटि मिलती है। त्रुटि के बाद त्रुटि, मुझे लगता है कि मैं सिर्फ tastypie के साथ छोड़ देंगे। –

+0

मैं एक स्वादिष्ट पाई विशेषज्ञ नहीं हूं, इसलिए मैं केवल और अनुमान लगा सकता हूं। क्या आपने विभिन्न प्रमाणीकरण और प्रमाणीकरण बैकएंड का उपयोग करने का प्रयास किया है? क्रमशः प्राधिकरण और प्रमाणीकरण के लिए स्वादिष्ट 'प्राधिकरण' और 'प्रमाणीकरण' कक्षाओं का उपयोग करने का प्रयास करें। उन्हें बहुत अनुमोदित होना चाहिए। यह जांचने के लिए कि क्या यह समस्या है। – nisc

उत्तर

3

ठीक है, मैंने इसे समझ लिया। मैं सावधान नहीं था। AJAX अनुरोध प्रकार को 501 लागू कार्यान्वित त्रुटि को संभालने के लिए "PUT" होना चाहिए था (मैं एक अद्यतन कर रहा था)। मैंने 403 त्रुटियों को संभालने के लिए एक कस्टम प्रमाणीकरण कक्षा भी स्थापित की है।

+0

डी ओह:) 8 और जाने के लिए ... – nisc

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