这是我的模特.我想捕获"地址"栏中的数据,然后将其显示在表格的下拉菜单中,我正在使用该表格填充另一个表格,而不是再次键入邮箱地址.

Create your models here.

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

推荐答案

你可以用ForeignKey [Django-doc]做这件事,这也可以保证referential integrity.

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=Trueauto_now=True,字段默认为不可编辑,因此不会出现在表单中.因此,该形式可以实现为:

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

这是__all__美元.

Django相关问答推荐

构造一个定制字符串(实体、年份和字母数字的组合)作为Django中的Postgres数据库的主键是否明智?

无法在 docker 启动Django项目

我的Django终结点不访问HAS_OBJECT_PERMISSION方法

Django prefetch_related 与 3 个不直接相关的模型

在Django Rest Framework中按模型属性排序时如何避免重新计算?

如何计算 Django 模型中特定对象的数量?

Django中的多对多关系?

djangorestframework:过滤相关字段

如何测试某个日志(log)消息是否记录在 Django 测试用例中?

Django rest-auth allauth 注册,带有邮箱、名字和姓氏,没有用户名

django 模板 if 或语句

现在如何在 Django 中处理每个对象的权限?

使用 get_object_or_404 获取数据库值

如何找到两个 Django 查询集的交集?

如何测试 Django QuerySets 是否相等?

1 个 django 应用程序中约有 20 个模型

将属性添加到 Django 模型的 Meta 类中

在 django admin 中控制 TextArea 小部件的大小

django.db.utils.OperationalError 无法连接到服务器

如何使用 Django/nginx 部署仅限 HTTPS 的站点?