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

如何在Django表单中基于内置User模型创建下拉菜单

把Django Project表单的user字段改成内置User下拉菜单的方法

1. 修改模型关联内置User

首先得把原模型里的user字符字段改成关联Django内置User模型的外键,这样才能从数据库拉取用户列表生成下拉:

# models.py
from django.db import models
from django.contrib.auth.models import User  # 导入内置User模型

class Project(models.Model):
    name = models.CharField(max_length=255, null=False)
    # 替换原CharField为ForeignKey,关联内置User
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    notes = models.TextField(null=True)
  • on_delete=models.SET_NULL:关联的用户被删除时,Project的user字段设为null,和原模型的null=True匹配
  • blank=True:允许表单提交时不选择用户,和null=True对应

2. 更新数据库迁移

模型改动后需要执行迁移,让数据库同步变化:

python manage.py makemigrations
python manage.py migrate

3. 表单调整(可选,按需自定义)

原有的ProjectForm其实已经能自动生成下拉菜单了——因为ForeignKey对应的表单字段默认是ModelChoiceField,下拉选项会显示用户的用户名(Django内置User的__str__默认返回用户名)。如果想自定义下拉显示的内容(比如同时显示用户名和邮箱),可以重写user字段:

# forms.py
from django.forms import ModelForm, ModelChoiceField
from .models import Project
from django.contrib.auth.models import User

class ProjectForm(ModelForm):
    user = ModelChoiceField(
        queryset=User.objects.all(),  # 下拉选项的用户列表
        empty_label="选择用户",  # 下拉框的默认提示选项
        required=False,  # 允许不选用户
        # 自定义每个选项的显示文本
        label_from_instance=lambda obj: f"{obj.username} ({obj.email})"
    )

    class Meta:
        model = Project
        fields = ["name", "user", "notes"]

如果不需要自定义显示,直接保留原来的Form代码就行,下拉菜单会自动生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:57:13