如何从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
相关产品推荐
相关产品推荐

