2012-02-03 16 views
6

¿Hay un sitio completo de ejemplo y configuración de django disponible para descargar? He estado luchando con mi cabeza todo el día. tengo el siguiente código. Básicamente, tengo un formulario POST que se maneja con ajax. Cuando hago clic en "enviar" en mi formulario y se ejecuta la solicitud de ajax, la llamada devuelve "POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (NO ENCONTRADO)" Tengo la URL configurada correctamente, creo. Puedo acceder al http://192.168.1.110:8000/api/private/client_basic_info/?format=json bien. ¿Me falta alguna configuración o cometer algunos errores fundamentales en mis métodos? Mi intención es que cada usuario pueda completar/modificar uno y solo un formulario/modelo de "información básica del cliente".publicación de tastypie y ejemplo completo

una página:

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

recursos

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

Editar:

archivo Mi recursos es ahora:

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) 

hice el campo de usuario de la anulable ClientBasicInfo un d el POST parece funcionar. Quiero intentar actualizar la entrada ahora. ¿Eso sería simplemente agregar el pk a la url de AJAX? Por ejemplo/api/private/client_basic_info/21 /? Cuando envío ese formulario, recibo un mensaje 501 NO IMPLEMENTADO. ¿Qué exactamente no he implementado? Estoy subclasificando ModelResource, que debería tener todas las funciones relacionadas con ORM implementadas de acuerdo con los documentos.

+0

¿Tal vez algún problema con APPEND_SLASHES? ¿Has intentado publicar en http://192.168.1.110:8000/api/private/client_basic_info (sin barra diagonal)? Solo una suposición. – nisc

+0

Hmm Quité la barra de la URL y obtuve "Llamaste a esta URL a través de POST, pero la URL no termina en una barra inclinada y tienes la APEND_SLASH configurada". Apliqué APPEND_SLASH = False a mi configuración y ahora recibo un mensaje 403 Prohibido (no se pudo verificar CSRF). Pasé eso haciendo que la vista csrf_exempt. Ahora recibo un error 501 no implementado. Agregué una función de hidratación personalizada y supere eso. Intento enviar un formulario para actualizar el objeto, pero aparece otro error. Error tras error, creo que me rendiré con tastypie. –

+0

No soy un experto en TastyPie, así que solo puedo hacer más conjeturas. ¿Has intentado utilizar diferentes backends de Autenticación y Autorización? Intenta utilizar las clases 'Authorization' y' Authentication' de tastypie para autorización y autenticación, respectivamente. Deberían ser muy permisivos. Solo para verificar si ese es el problema. – nisc

Respuesta

3

Bien, lo descubrí. No estaba siendo cuidadoso. El tipo de solicitud AJAX debería haber sido "PUT" para manejar el error 501 no implementado (estaba realizando una actualización). También configuré una clase de autenticación personalizada para manejar 403 errores.

+0

D'oh:) 8 más para ir ... – nisc

Cuestiones relacionadas