在DRF 2.3.13中自动赋值当前用户ID并隐藏字段不可编辑
解决Django Rest Framework 2.3.13中自动赋值user_id并隐藏字段的问题
针对你的需求,我们可以分两步实现:自动为user_id赋值当前用户ID,同时在BrowsableAPIRenderer渲染的页面中隐藏该字段,不让用户编辑或输入。
1. 在视图中自动赋值当前用户ID
在你的视图类(比如继承自CreateAPIView或GenericAPIView的子类)中,重写perform_create方法,将当前请求的用户ID赋值给序列化器的user_id字段:
from rest_framework import generics from .models import TagOwner from .serializers import TagOwnerSerializer class TagOwnerCreateView(generics.CreateAPIView): queryset = TagOwner.objects.all() serializer_class = TagOwnerSerializer def perform_create(self, serializer): # 将当前登录用户的ID赋值给user_id字段 serializer.save(user_id=self.request.user.id)
这样,当用户提交表单或发送POST请求时,user_id会自动被设置为当前登录用户的ID,无需手动输入。
2. 在序列化器中隐藏user_id字段的HTML输入框
虽然你已经设置了user_id = serializers.IntegerField(write_only=True),但BrowsableAPIRenderer仍会渲染出一个输入框。要隐藏它,我们可以为该字段指定widget为HiddenInput:
from rest_framework import serializers from django.forms.widgets import HiddenInput from .models import TagOwner class TagOwnerSerializer(serializers.HyperlinkedModelSerializer): tag_id = serializers.SlugRelatedField(slug_field='tag_id') # 修改user_id字段,添加widget参数指定为HiddenInput user_id = serializers.IntegerField(write_only=True, widget=HiddenInput()) class Meta: model = TagOwner # 记得包含user_id到fields列表中(如果之前没加的话) fields = ('tag_id', 'user_id', ...) # 替换为你的实际字段
这样设置后,在BrowsableAPIRenderer渲染的HTML页面中,user_id字段会变成一个隐藏的input元素,用户看不到也无法编辑,但提交时会携带该字段的值(由视图的perform_create自动赋值)。
注意事项
- 确保你的视图类中,用户已经登录(可以通过添加
permission_classes = [IsAuthenticated]来限制只有登录用户才能访问),否则self.request.user可能是匿名用户,导致赋值失败。 - DRF 2.3.13是比较旧的版本,部分API和新版本有差异,上述代码是针对该版本适配的写法。
内容的提问来源于stack exchange,提问作者Pramod
相关产品推荐
相关产品推荐

