2016-01-04 49 views
1

我正在集成django-rest-framework後端和Ember前端(使用EmberData)。這是我的版本:使用EmberData和Django REST框架的POST請求

  • 的Django 1.9
  • djangorestframework 3.3.2
  • (從GitHub latest version)Django的REST的架構,JSON-API
  • 燼-CLI 13年1月13日
  • 燼2.2.0
  • 餘燼數據2.2.1

GET請求是工作正常,但不是POST。這是EmberData來的各種要求:

{ 
    "data": { 
    "attributes": { 
     "name": "The project name", 
     "description": "The project description", 
     "price": 123 
    }, 
    "relationships": { 
     "onwer": { 
     "data": null 
     } 
    }, 
    "type": "projects" 
    } 
} 

但Django的崩潰,以及報告:

from rest_framework.routers import DefaultRouter 

from .viewsets.projects import ProjectViewSet 


router = DefaultRouter() 
... 
router.register(r'projects', ProjectViewSet) 
... 

ViewSet

Page not found ... The current URL, api/projects, didn't match any of these 

我的網址與路由器創建的:

from rest_framework import viewsets 
from rest_framework import filters 

from vwrks.models import Project 

from ..serializers import ProjectSerializer 

class ProjectViewSet(viewsets.ModelViewSet): 
    """ 
    A viewset for viewing and editing Project instances. 
    """ 
    serializer_class = ProjectSerializer 
    queryset = Project.objects.all() 
    filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter) 
    filter_fields = ('seller', 'artist', 'subcategory') 
    search_fields = ('name', 'description') 

根據文檔(http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset),ViewSet提供對.create()的支持,因此應支持此POST操作。

我也調整了尾隨斜槓Django的,爲了在/projectsEmberData接受POST s的做(除了默認/projects/是Django的期待)

# EmberData does POST to /projects (not /projects/), so we need this: 
APPEND_SLASH = False 

的問題,我看到的是, Django的路由器不產生project-create URL(僅project-listproject-detail列):

^api/ ^projects/$ [name='project-list'] 
^api/ ^projects\.(?P<format>[a-z0-9]+)/?$ [name='project-list'] 
^api/ ^projects/(?P<pk>[^/.]+)/$ [name='project-detail'] 
^api/ ^projects/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='project-detail'] 

我能做些什麼來獲得POST的請求從EmberDatadrf工作?

+0

項目清單與POST方法將調用創建() –

+0

@GeoJacob:這是我想太多,但隨後,爲什麼沒有發現「頁面...當前URL,api/projects,沒有匹配任何這些「 – dangonfast

+0

@GeoJacob:即使django有一個'APPEND_SLASH'標誌,這個'DefaultRouter'沒有考慮到這個嗎?無論如何,它會添加尾隨斜線! – dangonfast

回答

3

不要注意Django的消息:

You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8080/api/projects/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings. 

相關的系統是DRF's router,它不受APPEND_SLASH。你需要與刪除尾隨斜線:

router = DefaultRouter(trailing_slash=False)