如何使用Django Rest Framework为API视图设置自定义表单

时间:2014-12-17 21:10:38

标签: django django-rest-framework

我正在寻找一个从视图中继承django表单的表单。我正在使用django rest框架。到目前为止,这是我的代码:

class MyView(APIView):

    def get(self, request, format=None):

        # ... do stuff ...

我想为MyView的get方法呈现此表单

class XyzForm(forms.Form):
    x = forms.CharField(max_length=50, required=False)
    y = forms.CharField(max_length=50, required=False)
    z = forms.CharField(max_length=50, required=False)

1 个答案:

答案 0 :(得分:1)

在这个问题中,我展示了如何执行此操作:https://stackoverflow.com/questions/27782251/django-rest-framework-serializer-as-a-form-in-get-deprecated

我的解决方案还不是很满意(因此我的问题),但它确实有效。

不确定为什么......但上面已被删除(放弃问题......根据共识......)代码可能会帮助其他人和这个问题:

我只是向django rest framework(DRF)版本2.4.4升级(作为升级到3.0.2之前的一步,我来自2.3.6)

我在浏览api中显示一个表单时遇到了一些问题。

我使用的方法是GET获取列表,我将在2.3.6版本中解释我的方法(有效): 我曾经使用序列化程序作为表单来过滤一些数据。返回的值是使用modelserializer完成的。 过滤器与列表非常相关,而不是模型定义,因此使用内置过滤器系统对我来说不是一个选项。

我发现,通过其他问题,使用get方法(只有put,post和patch)时才显示表单。例如这个问题非常有用:https://stackoverflow.com/questions/17487471/how-to-modify-browsable-api-form?rq=1

这曾经是我的代码(在DRF 2.3.6中正常工作):

让我们说这是表单的序列化程序:

class SomeSerializerForm(serializers.Serializer):
    field1 = serializers.CharField(max_length=17)
    field2 = serializers.IntegerField(required=False)

这是返回数据的序列化程序:

class MyModelSerializer(ModelSerializer):
    class Meta:
       model = MyModel
       depth = 1

这是我的api观点:

class SomeApiView(GenericAPIView):
    permissions = (IsAuthenticated, )
    serializer_class = SomeSerializerForm

    def post(self, request, *args, **kwargs):
        serializerform = self.get_serializer(data=request.DATA)
        if not serializerform.is_valid():
            raise ParseError(detail="No valid values")
        field1 = request.DATA['field1']
        field2 = request.DATA['field2']
        myObjects=MyObject.objects.filter(some filter based on the fields and some extra functions above)
        serializer = MyModelSerializer(myObjects,many = True)
        return Response(serializer.data)

这完美地工作了(代码当然有点调整,但这是基本的事情)

但升级后这不再起作用了......

我找到了一些黑客来获取表格,使用:

假设我创建了这个表单:

并在我自己的渲染器中使用它:

class SomeApiForm(forms.Form):
    field1 = forms.CharField(max_length=17,help_text='help text with form 1')
    field2 = forms.IntegerField(required=False,help_text='another help text')


class MyBrowsableAPIRenderer(BrowsableAPIRenderer):
    def get_context(self, *args, **kwargs):
        context = super(MyBrowsableAPIRenderer, self).get_context(*args, **kwargs)
        context['display_edit_forms'] = True
        form = SomeApiForm()
        context['post_form'] = form 
        return context 

这再次像过去一样......但是

现在我正在寻找一种更通用的方式......

使用form = SomeApiForm()意味着我必须为每个API创建一个渲染器类...(所以它在一些令人费解之后起作用......但在我看来它不是一个很好的解决方案)

但问题是我的问题......或至少在我提出问题之前的部分: