POST django rest 框架后重定向

Posted

技术标签:

【中文标题】POST django rest 框架后重定向【英文标题】:Redirect after POST django rest framework 【发布时间】:2018-04-04 06:49:58 【问题描述】:

我正在通过 django 表单向我的 Django Rest Framework api 提交一个 POST 请求。

这是我的表单的 sn-p:

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

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)

我正在成功进行 POST(并且项目是在数据库中创建的),但是一旦我保存,我就会转到 URL /api/entry/,它显示了我的带有 Markdown 的 api。我想让它回到特定的网址。

如果成功,有没有办法自定义POST 重定向到的位置?

添加序列化器:

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     

【问题讨论】:

你能分享你的EntrySerializer吗? 编辑添加序列化程序 【参考方案1】:

viewsets.ModelViewSet 有一个方法 create 返回 Response 对象。响应对象是Django Response 的子类型。因此,您可以使用 HttpResponseRedirect 将行为更改为 create 方法。例如:

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)

【讨论】:

我从没想过重写 create 而是先调用 super。非常棒-非常感谢!! 你知道这是否记录在代码之外的地方吗?

以上是关于POST django rest 框架后重定向的主要内容,如果未能解决你的问题,请参考以下文章

django - 注册用户后重定向到页面

使用 jquery 在 POST 请求后重定向

Django Forms - 保存后重定向

Grails 2 Spring Security Plugin - 成功登录后重定向到 /login/denied

登录 Django 后重定向到 Next

django:登录后重定向到引用页面[重复]