我的表单会将数据发布到db。
我想在视图中添加一个隐藏的字段,它应该生成一个随机的密钥。
我的帖子功能是
def post(self, request, format=None):
request.data['code'] = id_generator()
data = request.data
serializer = registrationform(data=data)
if serializer.is_valid():
serializer.save()
x=serializer.data
data = { "ack":"success"}
return Response(data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
这里id_generator()将生成一些随机值。
在序列化程序中
class regiform(serializers.ModelSerializer):
code = serializers.CharField(read_only=True)
class Meta:
fields = ( 'mobile', 'profile_image', 'code')
model = registration
所以现在代码字段没有在API视图中显示,但是通过发布代码提交表单仍然是空的
答案 0 :(得分:3)
其实这一行
request.data['code'] = id_generator()
不会更新您的request.data。您通过假设request.data是一个字典来编写此行,它将使用新的字段代码更新您的dict。事实是request.data是QueryDict。
检查print type(request.data)
它不会以这种方式更新新字段。
为了达到您想要的效果,您可以转移您的代码'字段生成到序列化器的方式如下。
def post(self, request, format=None):
serializer = registrationform(data=request.data)
if serializer.is_valid():
serializer.save()
x=serializer.data
data = { "ack":"success"}
return Response(data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
串行器中的
class regiform(serializers.ModelSerializer):
code = serializers.SerializerMethodField()
class Meta:
fields = ( 'mobile', 'profile_image',)
model = registration
def get_code(self, obj):
return id_generator()
答案 1 :(得分:0)
问题在于您将设置为仅读取和文档说它将无法用于设置值:
将此属性设置为True可确保在序列化表示时使用该字段,但在反序列化期间创建或更新实例时不使用该字段。
因此,如果您想隐藏它,您可以在CharField中使用允许的样式标记,如:serializers.CharField(style={'input_type':'hidden'})
建议:您应该使用HiddenField而不是CharField,因为HiddenField从可调用或默认值中获取值,这似乎是您想要做的。