6

ダウンロード可能な完全なtastypie djangoのサンプルサイトとセットアップはありますか? 私は一日中頭を包み込むことに取り組んできました。次のコードがあります。基本的に、ajaxで処理されるPOSTフォームがあります。フォームで [送信] をクリックして ajax リクエストを実行すると、呼び出しで「POST http://192.168.1.110:8000/api/private/client_basic_info/ 404 (NOT FOUND)」が返されます。考える。http://192.168.1.110:8000/api/private/client_basic_info/?format=jsonに問題なくアクセスできます。いくつかの設定が欠けているか、メソッドに根本的な誤りがありますか? 私の意図は、各ユーザーが 1 つだけの「クライアント基本情報」フォーム/モデルに記入/変更できるようにすることです。

ページ:

{% 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 のユーザー フィールドを null 可能にすると、POST が機能するようです。今すぐエントリを更新してみたいと思います。pk を ajax URL に追加するだけでしょうか? たとえば、/api/private/client_basic_info/21/? そのフォームを送信すると、501 NOT IMPLEMENTED メッセージが表示されます。私は正確に何を実装していませんか?私は ModelResource をサブクラス化しています。これには、ドキュメントに従って実装されたすべての ORM 関連の機能が必要です。

4

1 に答える 1

3

わかりました。気をつけていませんでした。AJAX 要求タイプは、501 実装されていないエラーを処理するために「PUT」にする必要がありました (私は更新を実行していました)。403 エラーを処理するカスタム認証クラスもセットアップしました。

于 2012-02-05T21:16:29.240 に答える