размещение вкусного пирога и полный пример - PullRequest
6 голосов
/ 03 февраля 2012

Имеется ли полный пример сайта и настройка tastypie django для скачивания?Я боролся с тем, чтобы обернуть голову вокруг этого весь день.У меня есть следующий код.По сути, у меня есть форма POST, которая обрабатывается с помощью AJAX.Когда я нажимаю «отправить» в моей форме и запускается запрос ajax, вызов возвращает «POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (НЕ НАЙДЕНО)». Я думаю, URL-адрес настроен правильно.Я могу получить доступ http://192.168.1.110:8000/api/private/client_basic_info/?format=json просто отлично.Я пропускаю некоторые настройки или делаю некоторые фундаментальные ошибки в моих методах?Мое намерение состоит в том, чтобы каждый пользователь мог заполнить / изменить одну и только одну форму / модель «Базовая информация о клиенте».

страница:

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

ресурсы

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

Редактировать:

Мой файл ресурсов теперь:

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)

Я сделал пользовательское поле ClientBasicInfo обнуляемым, и POST, похоже, работает.Я хочу попробовать обновить запись сейчас.Будет ли это просто добавление ПК к URL Ajax?Например / api / private / client_basic_info / 21 /?Когда я отправляю эту форму, я получаю сообщение 501 NOT IMPLEMENTED.Что именно я не реализовал?Я создаю подкласс ModelResource, в котором все функции, связанные с ORM, должны быть реализованы в соответствии с документами.

1 Ответ

3 голосов
/ 06 февраля 2012

Хорошо, я понял это. Я не был осторожен. Тип запроса AJAX должен был быть «PUT» для обработки 501 не реализованной ошибки (я выполнял обновление). Я также настроил собственный класс аутентификации для обработки ошибок 403.

...