【问题标题】:Redirect after POST django rest frameworkPOST django rest 框架后重定向
【发布时间】: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吗?
  • 编辑添加序列化程序

标签: django django-forms django-rest-framework


【解决方案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。非常棒-非常感谢!!
  • 你知道这是否记录在代码之外的地方吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2016-12-27
  • 2018-08-18
  • 1970-01-01
  • 2020-10-05
  • 2018-10-03
  • 2017-04-16
相关资源
最近更新 更多