¿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.
¿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
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. –
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