在POST django休息框架后重定向

Tan*_*lee 5 django django-forms django-rest-framework

我通过django表单向我的Django Rest Framework api提交POST请求.

这是我的表格的片段:

<form action="{% url 'entry-list' %}" method="POST" class="form" role="form">
{% csrf_token %}

{{form.as_p}}
<div class = "form-group">
    <button type="submit" class="save btn btn-default btn-block">Save</button>
</div>
Run Code Online (Sandbox Code Playgroud)

views.py:

class entry_ViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class= EntrySerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly,)
    def perform_create(self, serializer):
        serializer.partial = True
        serializer.save(created_by=self.request.user)
Run Code Online (Sandbox Code Playgroud)

我正在成功发布POST(并且项目是在数据库中创建的),但是一旦我保存,我会转到/api/entry/显示我的api w/Markdown 的网址.我想让它回到一个特定的网址.

有没有办法自定义POST重定向到哪里成功?

添加了Serializer:

class EntrySerializer(serializers.ModelSerializer):

    created_by = serializers.ReadOnlyField(source='created_by.username')
    class Meta:
        model = Entry
        fields = '__all__'
    def __init__(self, *args, **kwargs):
        super(EntrySerializer, self).__init__(*args, **kwargs)        
        for x in self.fields:
            self.fields[x].required = False     
Run Code Online (Sandbox Code Playgroud)

Abb*_*der 10

viewsets.ModelViewSet有一个create返回Response对象的方法.响应对象是子类型Django Response.因此,你可以通过改变行为HttpResponseRedirectcreate法.例如:

class entry_ViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class= EntrySerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly,)

    def create(self, request, *args, **kwargs):
        response = super(entry_ViewSet, self).create(request, *args, **kwargs)
        # here may be placed additional operations for
        # extracting id of the object and using reverse()
        return HttpResponseRedirect(redirect_to='https://google.com')

    def perform_create(self, serializer):
        serializer.partial = True
        serializer.save(created_by=self.request.user)
Run Code Online (Sandbox Code Playgroud)

  • `从 django.http 导入 HttpResponseRedirect` (3认同)