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

如何从Employee表address字段取值并添加到表单下拉菜单以填充另一表

如何在表单下拉菜单中复用Employee表的邮箱地址

我想从Employee表的address字段中获取所有不重复的邮箱地址,把它们放到用于添加Category数据的SaveCategory表单的下拉菜单里,这样用户就不用重复输入邮箱了。


现有模型定义

Employee模型

class Employee(models.Model):
    address = models.EmailField(max_length=100,null=True)
    first_name = models.CharField(max_length=50,null=True)
    sec_name = models.CharField(max_length=50,null=True)       
    department = models.CharField(max_length= 50,null=True)
    company = models.CharField(max_length= 50,null=True)
    date_created = models.DateTimeField(default=timezone.now)
    date_updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.first_name + ' - ' + self.department

Category模型

class Category(models.Model):
    name = models.CharField(max_length=250)
    status = models.CharField(max_length=2, choices=(('1','Active'),('2','Inactive')), default=1)
    date_created = models.DateTimeField(default=timezone.now)
    date_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

现有表单代码

class SaveCategory(forms.ModelForm):
    name = forms.CharField(max_length="250")
    description = forms.Textarea()
    status = forms.ChoiceField(choices=[('1','Active'),('2','Inactive')])

class Meta:
    model = Category
    fields = ('name','status')

def clean_name(self):
    id = self.instance.id if self.instance.id else 0
    name = self.cleaned_data['name']
    # print(int(id) > 0)

    try:
        if int(id) > 0:
            category = Category.objects.exclude(id=id).get(name = name)
        else:
            category = Category.objects.get(name = name)
    except:
        return name

    raise forms.ValidationError(f"{name} Category Already Exists.")

实现方案

修改SaveCategory表单,添加动态获取不重复邮箱的下拉字段即可:

class SaveCategory(forms.ModelForm):
    name = forms.CharField(max_length=250)
    description = forms.Textarea()
    status = forms.ChoiceField(choices=[('1','Active'),('2','Inactive')])
    # 新增邮箱下拉字段,筛选非空且不重复的邮箱
    address = forms.ChoiceField(
        choices=[('', '请选择邮箱')] + [(addr, addr) for addr in Employee.objects.filter(address__isnull=False).values_list('address', flat=True).distinct()],
        required=False  # 非必填,根据需求可改为True
    )

    class Meta:
        model = Category
        fields = ('name','status', 'address')  # 将address加入表单字段列表

    def clean_name(self):
        id = self.instance.id if self.instance.id else 0
        name = self.cleaned_data['name']

        try:
            if int(id) > 0:
                category = Category.objects.exclude(id=id).get(name = name)
            else:
                category = Category.objects.get(name = name)
        except Category.DoesNotExist:
            return name

        raise forms.ValidationError(f"{name} 分类已存在。")

关键说明

  • Employee.objects.filter(address__isnull=False).values_list('address', flat=True).distinct():过滤空邮箱,提取所有不重复的地址值
  • [(addr, addr) for addr in ...]:让邮箱地址同时作为选项的value和显示文本,直观展示
  • 默认选项('', '请选择邮箱'):给用户提供选择提示,非必填场景下可留空
  • 异常捕获改为Category.DoesNotExist:避免捕获无关异常,让代码更严谨

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:38:34