如何从列中捕获数据并将其添加到表单的下拉菜单中以填充另一个表

问题描述 投票:0回答:1

这是我的模型。我想捕获“地址”列中的数据,然后将其显示在我用来填写另一个表格的表单的下拉菜单中,而不是再次输入电子邮件地址。

在此处创建您的模型。

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

这是我用来将数据添加到第二个模型的表单

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.")

这是我要添加数据的模型。

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
django django-models django-views django-forms
1个回答
0
投票

您可以使用

ForeignKey
 [Django-doc] 来完成此操作,这也将保证 引用完整性

class Category(models.Model):
    name = models.CharField(max_length=250, unique=True)
    status = models.CharField(
        max_length=2, choices=(('1', 'Active'), ('2', 'Inactive')), default=1
    )
    employee = models.ForeignKey(Employee, on_delete=models.PROTECT)
    description = models.TextField()
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

然而,您的表单实现了太多的样板逻辑。通过设置

unique=True
 [Django-doc],表单可以检查值本身是否是新的,并且通过使用
auto_now_add=True
auto_now=True
,字段默认是不可编辑的,因此将不会出现在表格中。因此,该表格可以实现为:

class CategoryForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = '__all__'

那就是

__all__

© www.soinside.com 2019 - 2024. All rights reserved.