Django rest框架:如何在可浏览的api中显示只读字段?
当我将result = serializers.CharField(read_only=True)添加到模型序列化程序中时,表单不再呈现结果字段。
我理解用户删除表单输入上的disabled属性所带来的安全问题(尽管我很惊讶django没有在本地处理这个问题),那么如何在result的api.html模板中实现只读字段呢
serializers.py
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
result = serializers.CharField(read_only=True)
class Meta:
model = Snippet
fields = ('title', 'code', 'owner', 'url', 'result')我是django-rest框架的新手,所以如果有任何帮助,我将不胜感激!
发布于 2015-12-30 18:59:14
您有两个选项:
序列化以在
中添加字段
您的选择取决于您是否希望在其他地方也使用该计算结果,以及您是否可以触摸模型。
当您想要在模型中计算结果时
以Django的派生全名为例,大概是:https://github.com/django/django/blob/master/django/contrib/auth/models.py#L348
或在文档中进行解释:https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods
这将自动用作DRF的只读字段。
你可以在下面的代码(get_full_name)中看到用法。
当您想要在序列化中添加字段时
您可以在DRF文档中找到答案:http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
SerializerMethodField这是一个只读的field...It,可用于将任何类型的数据添加到对象的序列化表示中。
Serializers.py中的示例hours_since_joined:
from django.contrib.auth.models import User, Group
from rest_framework import serializers
from django.utils.timezone import now
class UserSerializer(serializers.HyperlinkedModelSerializer):
hours_since_joined = serializers.SerializerMethodField()
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups', 'hours_since_joined', 'first_name', 'last_name', 'get_full_name' )
def get_hours_since_joined(self, obj):
return (now() - obj.date_joined).total_seconds() // 3600
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name', 'user_set')对于您的案例:
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
result = serializers.SerializerMethodField()
class Meta:
model = Snippet
fields = ('title', 'code', 'owner', 'url', 'result')
def get_result(self, obj):
# code here to calculate the result
# or return obj.calc_result() if you have that calculation in the model
return "some result"显示DRF的可浏览API中添加的字段
您需要在Meta字段中列出它们-请参见上面的示例。这将在请求的可浏览输出中显示出来。但是,它不会在DRF的HTML表单中显示它们。原因是HTML表单仅用于提交信息,因此restframework模板在呈现时跳过只读字段。
正如您所看到的,加入后的全名和小时数不会呈现在表单中,但可用于API:

如果还想在表单上显示只读字段,则为
您需要覆盖restframework模板。
确保在加载create框架之前加载模板(即,您的应用程序位于settings.py)
form.html
表单%}中字段的字段{% load rest_framework %} {% render_field
style=style %} {% Endfor%}
结果是:

发布于 2020-10-26 21:15:35
对于无法使其在Browsable API中可见的用户,应将模板文件夹命名为:rest_framework
https://stackoverflow.com/questions/34527669
复制相似问题