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