如何使用Django Rest框架为API视图设置自定义表单
我希望在视图上设置一个从django表单继承的表单。我正在使用django rest框架。以下是我目前的代码:如何使用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
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框架发布数据吗?没有找到问题,单击该链接。是的,不确定社区为什么删除了它,但我仍然可以打开它。。。所以我把它贴在这里。