2012-02-03 19 views
6

Tam bir tastypie django örnek sitesi var mı ve kurulum için hazır mı? Kafamı bütün gün sarmakla güreştim. Takip koduna sahibim. Temel olarak, ajax ile işlenen bir POST formu var. Formumda "gönder" i tıklattığımda ve ajax isteği çalıştırıldığında, çağrı "POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (BULUNAMADI)" ifadesini döndürür. Sadece http://192.168.1.110:8000/api/private/client_basic_info/?format=json'a erişebilirim. Bazı ayarları kaçırıyor mu yoksa yöntemlerimde bazı temel hatalar mı yapıyorum? Amacım, her kullanıcının bir ve yalnızca bir "istemci temel bilgi" formu/modeli doldurabilmesi/değiştirilmesidir.tastypie gönderme ve tam örnek

bir sayfa:

{% 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 %} 

kaynaklar

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'] 

Düzenleme:

Benim kaynaklarım dosyası artık geçerli:

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) 

Ben ClientBasicInfo Nullable kullanıcı alanını yapılmış bir d POST işe yarıyor gibi görünüyor. Girişi şimdi güncellemeyi denemek istiyorum. Bu sadece ajax url'ye pk ekliyor mu? Örneğin/api/private/client_basic_info/21 /? Bu formu gönderdiğimde 501 DEĞİLDEN bir mesaj aldım. Tam olarak neyi uygulamamışım? Ben docs göre uygulanan tüm ORM ile ilgili işlevleri olması gereken ModelResource alt sınıflandırma yapıyorum.

+0

Belki APPEND_SLASHES ile ilgili bir sorun mu var? Http://192.168.1.110:8000/api/private/client_basic_info adresine (eğik çizgi olmadan) göndermeyi denediniz mi? Sadece bir tahmin. – nisc

+0

Hmm URL'yi kapattım ve "Bu URL'yi POST yoluyla aradınız, ancak URL bir eğik çizgi ile bitmiyor ve APPEND_SLASH ayarlanmış." APPEND_SLASH = Ayarlarıma yanlış uyguladım ve şimdi 403 Yasak mesaj alıyorum (CSRF doğrulaması başarısız oldu). Bunu csrf_exempt görünümünü yaparak geçtim. Şimdi 501 uygulanmayan bir hata alıyorum. Özel bir hidrat işlevi ekledim ve bunu geçmiştim. Nesneyi güncelleştirmek için bir form göndermeye çalışıyorum ancak başka bir hata alıyorum. Hatadan sonra hata, sadece tastypie ile pes edeceğim düşünüyorum. –

+0

Ben bir TastyPie uzmanı değilim, bu yüzden sadece daha fazla tahmin yapabilirim. Farklı Kimlik Doğrulama ve Yetkilendirme arka uçları kullanmayı denediniz mi? Tastypie'nin “Yetkilendirme” ve “Kimlik Doğrulama” sınıflarını sırasıyla yetkilendirme ve kimlik doğrulama için kullanmaya çalışın. Çok müsaade etmeli. Sadece sorun olup olmadığını kontrol etmek için. – nisc

cevap

3

Tamam, anladım. Dikkatli değildim. AJAX istek tipi, 501 uygulanmayan hatayı işlemek için "PUT" olmalıdır (bir güncelleme gerçekleştiriyordum). Ayrıca, 403 hatalarını ele almak için özel bir kimlik doğrulama sınıfı oluşturdum.

+0

D'oh:) Gitmek için 8 daha fazla ... – nisc

İlgili konular