You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:32:33