title: tastypie posting and full example
body: <p>Is there a full tastypie django example site and setup available for download? I have been wrestling with wrapping my head around it all day. I have the following code. Basically, I have a POST form that is handled with ajax. When I click "submit" on my form and the ajax request runs, the call returns "POST <a href="http://192.168.1.110:8000/api/private/client_basic_info/" rel="noreferrer">http://192.168.1.110:8000/api/private/client_basic_info/</a> 404 (NOT FOUND)" I have the URL configured alright, I think. I can access <a href="http://192.168.1.110:8000/api/private/client_basic_info/?format=json" rel="noreferrer">http://192.168.1.110:8000/api/private/client_basic_info/?format=json</a> just fine. Am I missing some settings or making some fundamental errors in my methods? My intent is that each user can fill out/modify one and only one "client basic information" form/model.</p>
  
  <p>a page:</p>
  
  <pre><code>{% extends "layout-column-100.html" %}
  {% load uni_form_tags sekizai_tags %}
  
  {% block title %}Basic Information{% endblock %}
  
  {% block main_content %}
  
      {% addtoblock "js" %}
          &lt;script language="JavaScript"&gt;
  
          $(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('&lt;span class="success-message"&gt;Saved successfully!&lt;/span&gt;')
                              .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('&lt;span class="error-message"&gt;'+ field_error +'&lt;/span&gt;')
                          } 
                          form.find('input[type="submit"]').removeAttr('disabled')
                      }
                  }) // end $.ajax()
  
              }) // end $('#client_basic_info_form').submit()
  
          }) // end $(document).ready()
  
          &lt;/script&gt;
      {% endaddtoblock %}
  
  
  {% uni_form form form.helper %}
  
  
  {% endblock %}
  </code></pre>
  
  <p>resources</p>
  
  <pre><code>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() &lt; 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']
  </code></pre>
  
  <p>Edit:</p>
  
  <p>My resources file is now:</p>
  
  <pre><code>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() &lt; 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)
  </code></pre>
  
  <p>I made the user field of the ClientBasicInfo nullable and the POST seems to work. I want to try updating the entry now. Would that just be appending the pk to the ajax url? For example /api/private/client_basic_info/21/? When I submit that form I get a 501 NOT IMPLEMENTED message. What exactly haven't I implemented? I am subclassing ModelResource, which should have all the ORM-related functions implemented according to the docs.</p>