2012-02-03 14 views
6

Czy jest dostępna pełna strona przykładowego instalatora Django? Zmagałem się z owinięciem głowy przez cały dzień. Mam następujący kod. Zasadniczo, mam formularz POST, który jest obsługiwany z ajax. Kiedy klikam "submit" w moim formularzu, a zapytanie ajax działa, wywołanie zwraca "POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (NIE ZNALEZIONO)" Mam adres URL skonfigurowany w porządku, myślę. Mogę uzyskać dostęp do http://192.168.1.110:8000/api/private/client_basic_info/?format=json dobrze. Czy brakuje mi niektórych ustawień lub podstawowych błędów w moich metodach? Moim zamiarem jest, aby każdy użytkownik mógł wypełnić/zmodyfikować jedną i tylko jedną "formę podstawową" klienta/model.Wysyłanie zapytania i pełny przykład:

strony:

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

zasoby

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:

Mój plik zasobów jest teraz:

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) 

zrobiłem pole użytkownik Nullable ClientBasicInfo na d POST wydaje się działać. Chcę teraz spróbować zaktualizować wpis. Czy to byłoby tylko dołączenie pk do adresu URL ajax? Na przykład/api/private/client_basic_info/21 /? Kiedy przesyłam ten formularz, otrzymuję komunikat 501 NOT IMPLEMENTED. Co dokładnie nie wdrożyłem? Generuję podklasy ModelResource, które powinny mieć wszystkie funkcje powiązane z ORM zaimplementowane zgodnie z dokumentami.

+0

Może jakiś problem z aplikacją APPEND_SLASHES? Czy próbowałeś wysłać do http://192.168.1.110:8000/api/private/client_basic_info (bez ukośnego slasha)? Tylko zgadnij. – nisc

+0

Hmm Zrobiłem ukośnik z adresu URL i otrzymałem komunikat "Nazwałeś ten URL przez POST, ale adres URL nie kończy się ukośnikiem i masz ustawioną opcję APPEND_SLASH." Zastosowałem APPEND_SLASH = False do moich ustawień, a teraz dostaję komunikat Forbidden 403 (weryfikacja CSRF nie powiodła się). Przekroczyłem to, tworząc widok csrf_exempt. Teraz dostaję błąd 501 nie zaimplementowany. Dodałem niestandardową funkcję hydratacji i minęłem ją. Próbuję przesłać formularz do zaktualizowania obiektu, ale pojawia się kolejny błąd. Błąd po błędzie, myślę, że po prostu zrezygnuję z tastypie. –

+0

Nie jestem ekspertem od TastyPie, więc mogę tylko zgadnąć więcej. Czy próbowałeś używać różnych Uwierzytelnień i Autoryzacji? Spróbuj użyć klas 'Authorization' i' Authentication' dla autoryzacji i uwierzytelnienia. Powinny być bardzo liberalne. Wystarczy sprawdzić, czy to jest problem. – nisc

Odpowiedz

3

Okej, wymyśliłem to. Nie byłem ostrożny. Typ żądania AJAX powinien być "PUT", aby obsłużyć błąd 501 nie zaimplementowany (wykonałem aktualizację). Skonfigurowałem również niestandardową klasę uwierzytelniania, aby obsługiwać błędy 403.

+0

D'oh:) Jeszcze 8 przejść ... – nisc