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

如何在Django表单中根据用户类型动态调整Choice字段的可选选项

实现步骤

1. 调整表单类,接收用户参数并动态过滤选项

重写表单的__init__方法,接收从视图传入的用户对象,再根据用户角色设置对应的可选选项:

from django import forms
from .models import Lesson

class SubmitForm(forms.ModelForm):
    class Meta:
        model = Lesson
        fields = ("status",)

    def __init__(self, *args, **kwargs):
        # 取出视图传入的当前登录用户
        self.user = kwargs.pop("user", None)
        super().__init__(*args, **kwargs)

        # 按用户角色过滤可选状态,以下判断逻辑可根据你的实际用户体系修改
        if self.user:
            # 示例:学生角色可选状态
            if self.user.role == "student":
                self.fields["status"].choices = [
                    ("Attended", "Attended"),
                    ("Absent", "Absent"),
                    ("Student Postponed", "Student Postponed"),
                ]
            # 示例:教师角色可选状态
            elif self.user.role == "teacher":
                self.fields["status"].choices = [
                    ("Attended", "Attended"),
                    ("Absent", "Absent"),
                    ("Teacher Postponed", "Teacher Postponed"),
                ]
            # 管理员默认保留全部选项,无需修改

2. 改造视图类,将当前用户传递给表单

重写通用视图的get_form_kwargs方法,把request.user注入到表单的初始化参数中:

from django.views import generic
from .models import Lesson
from .forms import SubmitForm

class SubmitView(generic.UpdateView):
    template_name = "agents/submit_form.html"
    queryset = Lesson.objects.all()
    context_object_name = "lesson"
    form_class = SubmitForm

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        # 将当前登录用户传入表单
        kwargs["user"] = self.request.user
        return kwargs

注意事项

  • 上述代码中的用户角色判断(self.user.role == "student")仅为示例,请替换为你项目中实际的用户身份判断逻辑
  • 动态修改后的choices会自动参与表单提交校验,无需额外编写验证规则,Django会自动校验提交值是否属于当前设置的可选范围

内容的提问来源于stack exchange,提问作者coderDcoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:36:04