2012-02-03 32 views
6

Có trang web ví dụ đầy đủ về chế độ ăn ngon và thiết lập sẵn có để tải xuống không? Tôi đã vật lộn với việc quấn đầu quanh nó cả ngày. Tôi có đoạn mã sau. Về cơ bản, tôi có một mẫu POST được xử lý bằng ajax. Khi tôi nhấp vào "gửi" trên biểu mẫu của tôi và yêu cầu ajax chạy, cuộc gọi trả về "POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (KHÔNG TÌM KIẾM)" Tôi đã định cấu hình URL được, tôi nghĩ vậy. Tôi có thể truy cập http://192.168.1.110:8000/api/private/client_basic_info/?format=json tốt. Tôi có thiếu một số cài đặt hoặc thực hiện một số lỗi cơ bản trong phương pháp của mình không? Mục đích của tôi là mỗi người dùng có thể điền/sửa đổi một và chỉ một mẫu "mô hình/thông tin cơ bản của khách hàng".đăng bài yêu thích và ví dụ đầy đủ

một trang:

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

nguồn

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

Edit:

tập tin nguồn của tôi bây giờ là:

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) 

tôi đã thực hiện các lĩnh vực sử dụng của nullable ClientBasicInfo một d POST dường như hoạt động. Tôi muốn thử cập nhật mục nhập ngay bây giờ. Điều đó sẽ chỉ được thêm pk vào url ajax? Ví dụ/api/private/client_basic_info/21 /? Khi tôi gửi biểu mẫu đó, tôi nhận được thông báo KHÔNG THỰC HIỆN 501. Chính xác thì tôi chưa triển khai gì? Tôi đang phân lớp ModelResource, cần có tất cả các hàm liên quan đến ORM được triển khai theo các tài liệu.

+0

Có thể một số vấn đề với APPEND_SLASHES? Bạn đã thử đăng bài lên http://192.168.1.110:8000/api/private/client_basic_info (không có dấu gạch chéo)? Chỉ cần đoán thôi. – nisc

+0

Hmm Tôi lấy dấu gạch chéo ra khỏi url và nhận "Bạn đã gọi URL này qua POST, nhưng URL không kết thúc bằng dấu gạch chéo và bạn đã đặt APPEND_SLASH". Tôi đã áp dụng APPEND_SLASH = False cho cài đặt của mình và giờ tôi nhận được thông báo Cấm 403 (xác minh CSRF không thành công). Tôi đã vượt qua điều đó bằng cách làm cho xem csrf_exempt. Bây giờ tôi nhận được lỗi 501 không được triển khai. Tôi đã thêm một chức năng hydrate tùy chỉnh và vượt qua điều đó. Tôi cố gắng gửi biểu mẫu để cập nhật đối tượng nhưng tôi gặp lỗi khác. Lỗi sau khi lỗi, tôi nghĩ rằng tôi sẽ chỉ từ bỏ với ngon. –

+0

Tôi không phải là chuyên gia TastyPie, vì vậy tôi chỉ có thể đoán được nhiều hơn. Bạn đã thử sử dụng các chương trình phụ trợ xác thực và ủy quyền khác nhau hay không? Hãy thử sử dụng các lớp 'Authorization' và' Authentication' của deliciouspie để ủy quyền và xác thực tương ứng. Họ nên rất dễ dãi. Chỉ để kiểm tra xem đó có phải là vấn đề không. – nisc

Trả lời

3

OK, tôi đã tìm ra. Tôi không cẩn thận. Loại yêu cầu AJAX phải là "PUT" để xử lý lỗi không được triển khai 501 (tôi đã thực hiện cập nhật). Tôi cũng đã thiết lập một lớp xác thực tùy chỉnh để xử lý 403 lỗi.

+0

D'oh:) 8 nữa để đi ... – nisc

Các vấn đề liên quan