Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Django Rest框架为API视图设置自定义表单_Django_Django Rest Framework - Fatal编程技术网

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

如何使用Django Rest框架为API视图设置自定义表单,django,django-rest-framework,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=Fals

我希望在视图上设置一个从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)

在这个问题中,我展示了如何做到这一点:

我对我的解决方案还不是很满意(因此我提出了问题),但它是有效的

不知道为什么。。。但上述内容已被删除(根据公报,被放弃的问题…)代码可能会帮助其他人,这个问题:

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

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

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

通过其他问题,我发现使用get方法(仅put、post和patch)时表单没有显示是相关的。e、 g.这个问题很有帮助:

这曾经是我的代码(在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)
这工作得很好(代码当然有点调整,但基本上就是这样)

但升级后,这不再有效

我发现了一些黑客在get中再次获取表单,使用:

假设我创建了这个表单:

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

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创建一个渲染器类。。。(因此,在一些令人费解的情况下,它是有效的……但在我看来,这不是一个好的解决方案)


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

使用Django和DRF的版本号更新问题。Django 1.7.1和DRF 3.0.0DRF自动映射表单字段,因此不必定义自己的自定义表单类。您应该创建新的序列化程序(继承),并在视图中使用它进行html表单呈现。您能给出您想要实现的最终目标吗?你只是想通过rest框架发布数据吗?没有找到问题,单击该链接。是的,不确定社区为什么删除了它,但我仍然可以打开它。。。所以我把它贴在这里。