我正在寻找一个从视图中继承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)
答案 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创建一个渲染器类...(所以它在一些令人费解之后起作用......但在我看来它不是一个很好的解决方案)
但问题是我的问题......或至少在我提出问题之前的部分: