2017-07-27 9 views
1

サンプルアプリケーションをRest Frameworkチュートリアルからテンプレート付きのアプリに変換しようとしています。問題は、単一のレコードの詳細ビューで削除ボタンを作成できないことです。 私のviews.pyは以下のとおり:Django Rest_Framework:テンプレートのcall deleteメソッド

class SnippetViewSet(viewsets.ModelViewSet): 

queryset = Snippet.objects.all() 
serializer_class = SnippetSerializer 
permission_classes = (permissions.IsAuthenticatedOrReadOnly, 
         IsOwnerOrReadOnly,) 
renderer_classes = [renderers.TemplateHTMLRenderer] 
template_name = 'list.html' 


def list(self, request, **kwargs): 
    print(request.method, request.user) 
    queryset = Snippet.objects.all() 
    serializer = SnippetSerializer(context={'request': request}) 
    return Response({'queryset': queryset, 'serializer': serializer}, template_name='list.html') 


def retrieve(self, request, *args, **kwargs): 
    print(request.method, 'retrieve') 
    queryset = self.get_object() 
    serializer_class = SnippetSerializer(queryset, context={'request': request}) 
    return Response({'queryset': queryset, 'serializer': serializer_class}, template_name='retrieve.html') 


def create(self, request, *args, **kwargs): 
    print(request.method, 'create') 
    serializer = SnippetSerializer(instance=None, context={'request': request}, data=request.data) 
    if serializer.is_valid(): 
     serializer.save(owner=self.request.user) 
     return redirect('snippet-list') 


def post(self, request, *args, **kwargs): 
    print(request.method, 'post') 
    queryset = self.get_object() 
    serializer = SnippetSerializer(queryset, data=request.data, context={'request': request}) 
    if not serializer.is_valid(): 
     return Response({'serializer': serializer, 'queryset': queryset}) 
    serializer.save() 
    return redirect('snippet-list') 


def destroy(self, request, *args, **kwargs): 
    instance = self.get_object() 
    self.perform_destroy(instance) 
    return Response(status=status.HTTP_204_NO_CONTENT) 

def perform_destroy(self, instance): 
    instance.delete() 

urls.pyは横ばい:

snippet_list = SnippetViewSet.as_view({ 
'get': 'list', 
'post': 'create', 
}) 

snippet_detail = SnippetViewSet.as_view({ 
    'get': 'retrieve', 
    'put': 'update', 
    'patch': 'partial_update', 
    'delete': 'destroy', 
}) 
user_list = UserViewSet.as_view({ 'get': 'list'}) 
user_detail = UserViewSet.as_view({ 
    'get': 'retrieve', 
    'put': 'update', 
    'patch': 'partial_update', 
    'delete': 'destroy' 
}) 
urlpatterns = format_suffix_patterns([ 
    url(r'^', snippet_list, name='snippet-list'), 
    url(r'^snippets/$', snippet_list, name='snippet-list'), 
    url(r'^snippets/(?P<pk>[0-9]+)$', snippet_detail, name='snippet-detail'), 
    url(r'^users/$', user_list, name='user-list'), 
    url(r'^users/(?P<pk>[0-9]+)/$', user_detail, name='user-detail'), 
]) 

フォームテンプレート:

<form action="{% url 'snippet-detail' pk=queryset.pk %}" method="post"> 
{% csrf_token %} 
{% render_form serializer %} 
<input type="submit" value="Save"> 
<a href="{% url 'snippet-detail' pk=queryset.pk %}" methods="delete">delete</a> 

私がクリックした後に得ることができるすべての削除ボタンはリトリーブ・ビューのリロードです。 deleteメソッドを除くすべてが正常に動作します。私は見逃しがたいものがあることを知っていますが、あなたが私に正しい方向を向けることができれば、感謝するでしょう。

答えて

0

snippet-detail urlへのリクエストでdeleteメソッドを使用して破棄ビューにアクセスするのが問題です。あなたは多分またあなたがにリダイレクトして、応答を返すようにビューを破壊したい

snippet_destroy = SnippetViewSet.as_view({ 
    'post': 'destroy', 
}) 

urlpatterns = format_suffix_patterns([ 
    url(r'^snippets/(?P<pk>[0-9]+)/delete$', snippet_destroy, name='snippet-delete'), 
]) 

<form action="{% url 'snippet-delete' pk=queryset.pk %}" method="post"> 
    {% csrf_token %} 
    <input type="submit" value="Delete"> 
</form> 

を使用します。But that method is not available to html forms

だから、このビューにアクセスする別の方法にようなものが必要別のURL。


オリジナルの答え:

あなたは両方のアクション、更新のための1、および削除のための1つのフォームを使用する必要があります。フォームはdeleteメソッドでリクエストすることができます。aタグではできません。

<form action="{% url 'snippet-detail' pk=queryset.pk %}" method="post"> 
    {% csrf_token %} 
    {% render_form serializer %} 
    <input type="submit" value="Save"> 
</form> 

<form action="{% url 'snippet-detail' pk=queryset.pk %}" method="delete"> 
    {% csrf_token %} 
    <input type="submit" value="Delete"> 
</form> 
+0

残念ながらそれはしません。このボタンは、 'http:// localhost:8000/snippets/15 /?csrfmiddlewaretoken ='のようなトークンを持つリンクを生成しますが、同じページにとどまります。 – ZmuA

+0

ボタンをクリックすると、リクエストの詳細を確認できますか?特に方法と応答。 destroyビューはHTTP_204_NO_CONTENTレスポンスを返します。これは、フォームを送信した後に同じページに留まる理由を説明していると思います。 [参照:](https://stackoverflow.com/questions/3283071/is-there-a-way-to-ignore-form-response) –

+0

私はGETメソッドを取得しています。応答の種類はわかりませんが、HTTP応答は200です。 – ZmuA

関連する問題